App包瘦身(二) —— 基于pre-commit的图片提交的自动化压缩(一)

版本记录

版本号 时间
V1.0 2021.11.14 星期日

前言

随着App的持续功能迭代和常年的运营,最终包都会越来越大,包太大苹果那边会给限制,不利于用户下载。所以App瘦身也是一项需要持续做的事。正好我这几天就在做瘦身的事,这里记录一下,大家一起学习和交流。感兴趣的可以看下面几篇文章。
1. App包瘦身(一) —— App包瘦身初探(一)

主要内容

主要内容:本文主要做的就是基于pre-commit代码提交时,对所提交图片进行自动化压缩,这个过程对于提交代码的人是无感知的。可以实现自动化压缩并提交这个过程。

下面我们开始。


pre-commit简介

pre-commit是什么?字面的意思就是commit之前,那这个是用来干什么的呢?这就不得不从git说起。

pre-commitcommit之前,是一个hook,也可以称为钩子,这个东西有什么用呢?就是你可以利用这个hookcommit之前做一些提交之前的检测或压缩或者其他的自定义脚本。hooks是一些自定义的脚本,用于控制git工作的流程,分为客户端钩子和服务端钩子。

  • 客户端钩子包括:pre-commit、prepare-commit-msg、commit-msg、post-commit等,主要用于控制客户端git的提交工作流。
  • 服务端钩子:pre-receive、post-receive、update,主要在服务端接收提交对象时、推送到服务器之前调用。

git hooks位置位于每个git项目下的隐藏文件夹.git中的hooks文件夹里,进去后会看到一些hooks的官方示例,他们都是以.sample结尾的文件名。具体如下图所示:

注意:这些以.sample结尾的示例脚本需要重新更改才会实现想要的结果。

下面我们可以简单的看一下pre-commit.sample里默认都是什么。

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=$(git hash-object -t tree /dev/null)
fi

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)

# Redirect output to stderr.
exec 1>&2

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
    # Note that the use of brackets around a tr range is ok here, (it's
    # even required, for portability to Solaris 10's /usr/bin/tr), since
    # the square bracket bytes happen to fall in the designated range.
    test $(git diff --cached --name-only --diff-filter=A -z $against |
      LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
    cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
    exit 1
fi

# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

上面就是默认的,下面我们就是对这个pre-commit进行定制化,并在其中植入图片压缩的脚本,这样当commit代码的时候会检查,你提交的内容,如果是png、jpg等格式的图片,就会运行python脚本对该图片进行压缩。

下面是修改以后的hook文件夹目录。


pre-commit修改

pre-commit.sample文件进行的修改。主要就是修改为以下内容:

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=xxxxxxxx
fi

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)

# Redirect output to stderr.
exec 1>&2

filepath=$(cd "$(dirname "$0")"; pwd)  

branch=$(git symbolic-ref --short HEAD)

git diff --cached --name-only --diff-filter=ACMR -z $against | while read -d $'\0' f; do
if [[ $f == *".png" || $f == *".jpg" || $f == *".jpeg" || $f == *".webp" ]];then
    path="$(cd "$(dirname "$0")";cd ..;cd ..; pwd)/$f"
    python "$filepath/imagecompress.py" $path $branch
    exec git add $f
fi


done

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
    # Note that the use of brackets around a tr range is ok here, (it's
    # even required, for portability to Solaris 10's /usr/bin/tr), since
    # the square bracket bytes happen to fall in the designated range.
    test $(git diff --cached --name-only --diff-filter=A -z $against |
      LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
    cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
    exit 1
fi

# If there are whitespace errors, print the offending file names and fail.
# exec git diff-index --check --cached $against --

这里的作用就是首先判断提交的代码,是不是包含.png/.jpeg/.webp等格式的文件,如果包含的话就会调用imagecompresspython脚本进行自动化的压缩。

下面看下压缩脚本imagecompress

# -*- coding: utf-8 -*-
import urllib2
import json
import sys
import os
from base64 import b64encode

class ImageHelper:
    def __init__(self, imagePath, branch):
        self.imagePath = imagePath
        self.branch = branch
    def compress(self):
        file_name = '%s.txt' % self.branch
        file_name = file_name.replace('/', ',');
        path = '%s/%s' % (sys.path[0],file_name)
        print 'path %s' % path
        fp = open(path, 'a')
        print 'compressing %s ...' % self.imagePath
        data = open(self.imagePath, 'rb').read()
        print 'size before compress: %d' % len(data)
        apikey = '自己申请的api key'
        req = urllib2.Request('https://api.tinify.com/shrink', data=data)
        req.add_header('Authorization', 'Basic %s' % b64encode(bytes("api:" + apikey).decode('ascii')))
        try:
            res = urllib2.urlopen(req)
        except urllib2.HTTPError:
            print 'request failed'
            context = 'imagePath: %s ; request failed\n' % (self.imagePath)
            fp.write(context)
            return
        if res.getcode() == 201:
            url = res.headers.get('Location')
            result = json.loads(res.read())
            newlength = result['output']['size']
            print 'compress completed! url: %s length %d' % (url, newlength)
            newdata = urllib2.urlopen(url).read()
            open(self.imagePath, 'wb').write(newdata)
            context = 'imagePath: %s ; oldlength: %d ; newlength: %d\n' % (self.imagePath, len(data), newlength)
            fp.write(context)
        else:
            print 'compress failed, try again'
            context = 'imagePath: %s ; compress failed\n' % (self.imagePath)
            fp.write(context)
            compress()

        fp.close()


def main():
    image_helper = ImageHelper(sys.argv[1],sys.argv[2])
    image_helper.compress()
    print "~~~~~~~~~~~~~~~~~~~~~~"

if __name__=='__main__':
    main()

实践结果

下面我们就对上面的理论进行实践。

1. png图片

我们先看下准备的png图片,大小为4.2MB,如下图所示:

然后我们把图片放到项目里,并打开终端,用git commit命令进行提交。具体提交记录如下:

可以看见,终端输出了compress completed!。然后我们看项目里这个图片文件。

[图片上传失败...(image-dec60-1636887416755)]

可以看见提交的这个图片大小变为了707KB。完美进行了自动化压缩。

2. JPG图片

这个测试过程和上面也是一样的,也是准备图片,然后放入工程里,提交代码这个流程。

测试材料


测试结果

需要说明的是,不仅仅是终端提交git commit命令可以,就是sourceTree提交也可以触发这个自动化的压缩过程,因为都会去触发pre-commit的那个钩子。

到此为止,这个简单的问题应该就说明白了,欢迎大家指正错误。

后记

本篇主要讲述了基于pre-commit的图片提交的自动化压缩,感兴趣的给个赞或者关注~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容