开发NB-App中使用的脚本们

在开发NB-App的过程中,为了方便,写了一些小脚本,这里一一列举一下。

脚本地址:https://github.com/Forkong/app-scripts

jsonserver脚本

在后端开发人员只给出接口但并未开发完全的时候,这个脚本会充当返回静态json的角色。

基于web.py框架实现,web.py是天才Aaron Swartz开发的一款小型web框架,对于我们来说,入门简单,功能够用。


中文抽离脚本 - 多语言功能

NB-App在2.0版本时期开始支持英文,主要原因是我们的App是给途牛的供应商使用的,而从统计工具上可以看出,我们现在的供应商已经遍及亚洲、欧洲、非洲、北美洲、南美洲、大洋洲,30+的国家和地区,英文版本的支持还是很有需求的。

但是前期在开发过程中并没有料到这种需求,所以并没有留口,中文内容并未抽离,所以我们写了一个抽离脚本。

抽离脚本比较简单,这就不贴出来了。

excel->strings脚本

在产品翻译好我们要求的词条之后,产品会把这些汇总在excel上,类似于下面:

而我们想要的是这样的:

这种工作如果人工来的话,此工作量显而易见,初版的词条个数就已经达到700+了,手动的话,会死人的。

这个脚本会将excel内容按格式输出到strings文件中。

相配套的,还有一个脚本用于输出产品遗漏和重复的内容。

excel文件读取使用的是python的xlrd库,这个库用起来很方便。这个xlrd库对应的写操作是xlwt库,但是xlwt只可以写一些简单的excel。

我举个例子,我们组一般用wiki上的表格写需求的review意见,之后需要汇总到excel上(为啥要汇到excel,这是一个科技公司该有的思维方式吗?那是文员的工具好吧!)。所以,我写了个脚本,脚本会从网页上解析表格内容,再自动填充到excel上,但是,相信我,这个表格很复杂,还带有大量的宏,写进去直接乱了。我找了好点时间都没有找到更好的库,最后,没办法,我只好先生成一个简单的excel,然后再手动复制粘贴到复杂的excel上,然后再点几下,才能完成。

Strings拷贝脚本 - 动态多语言功能

在多语言功能完成后,我们又开发了一个动态多语言的功能,这个功能要求可以动态修改App中的中英文显示。这样的话,本来Localizable.strings (Chinese)文件中的中文不全是没有关系的,但是现在不行了,如果中文中没有对应值的话,我们就无法动态修改了(Hook、Patch的方法就算了)。

所以我写了一个Strings拷贝脚本,这个脚本会把Localizable.strings (English)中的Key拷贝过去,生成中文版,例如:

Localizable.strings (English)

"行程冲突" = "scheduling conflict";
"乘客信息有误" = "error of customer information";
"失败原因" = "reason of failure";

在编译之后,会自动替换中文Strings文件。

Localizable.strings (Chinese)

"行程冲突" = "行程冲突";
"乘客信息有误" = "乘客信息有误";
"失败原因" = "失败原因";

此脚本只会导出中文,具体从哪个Localizable.strings导入到哪个Localizable.strings可以在脚本内设定。

多Target比较脚本

在NB-App的开发中,逐渐加入了一些测试功能,因为一些原因,我们需要设置多个Target。

但是多Target会带来一些问题,比如下面这些情况人工是比较难以区分的:

  1. 文件应该只存于一个target,但是难以确定其他target是否包含。
  2. 文件应该存于所有target,但难以确定是否所有target已添加此文件。
  3. 链接的Library或者Framework应该只存于一个target, 但是难以确定其他target是否包含。
  4. 链接的Library或者Framework应该存于所有target,但难以确定是否所有target都已包含。

所以我写了一个脚本,从pbxproj文件上去读信息,在编译时自动生成报告,大致如下:

如果你有多个target的话,而且每次创建新文件都需要确保添加到所有target里面的话,我建议你用破博客的AllTargets插件。

这些小脚本本意并非想要开源,只是为了方便我的工作的,所以在实现的功能上会很基础,但是已足够我使用了。

我这个脚本只适合在两个target的情况下使用,如果target较多,你可以修改此脚本。脚本写的很基础,随便改吧。

代码量统计脚本

公司某次要求我们统计代码量,我嘞个去,他们自己统计的量可大了,这不行啊,代码量太大显的我low啊,所以我自己写了个脚本来统计。

这个脚本可以忽略空白行、以\\开头的注释行,并可过滤指定目录的文件,也可以设定输出代码行数>x的文件名称。

恩,这样就显的我的代码量小了。

SVN commit 行数统计脚本

这个脚本是我为了统计自己每天的工作量而开发的脚本。

原理是从工程的svn log上获取版本号,之后依次diff版本,从输出的diff信息上统计新增和删除的代码行数,之后按日期汇总输出,输出如下:

以前公司也用一个SVN的统计工具,叫做StatSVN,大家有兴趣的可以尝试一下。

XIB 修改脚本

在早期xib上画线的时候,不能给某个view设置宽度为非整数,比如我设置为0.5,可以设置成功,但是在Xcode上面还是显示1。

这个脚本就是为了批量设置线款的,所以就没必要贴出来了,比较简单。

python源码文件转化为Unix可执行文件

有的时候,我们无法要求每个mac都安装和你一样的库,而我们又要求我们的脚本可以运行,这有很多办法,可以用virtualenv,也可以直接将python源码转化为.exe或者unix可执行文件。

这其中有很多工具,我一般使用PyInstaller,这在谷歌或者百度一搜就有一堆,我就不再赘述了。

这种方式会把环境和库也打上去,所以一般来说会比较大,可能有好几兆,甚至十几兆。

Xcode添加执行脚本

上述的脚本中,有一些需要在每次编译后运行,那么我们可以将脚本添加到Xcode中,具体方式如下:

Build Phases中可以新建Run Script,之后可以修改脚本名称,以区分不同的脚本。Xcode只能指定为shell执行,如果是python的话,执行方式可以和下面类似:

python ./Scripts/exchange.py

如果是打包成可执行文件的话,执行方式类似于下面,直接执行此文件即可:

./Scripts/diff_project

我这里的exchange脚本使用python直接执行,而diff_project脚本需要打包成可执行文件,最主要的原因是,diff_project脚本中使用到了python的PyObjc库,而其他人的电脑上往往是没有这个库的。

Article Published in on iOS, Python

Article by 付军