怎么用ruby来写脚本java 读取apk版本号ios的版本号

iOS 工程自动化 - Ruby 入门到辅助脚本编写
我的图书馆
iOS 工程自动化 - Ruby 入门到辅助脚本编写
Ruby 入门Ruby 官方入门教程推荐一个 Ruby 官方的入门教程,可以在线边学习边实践:bundlerbundler 是用于管理 ruby gem 的工具。跟 cocoapods 非常像,看看下面的例子:source 'http://ruby.taobao.org'gem 'cocoapods', '~&0.37.2'gem 'fastlane', '~&1.4.0'?一模一样,让人害怕。安装和执行的指令也是,高度一致:sudo gem install bundlerbundle install而且 bundle install 之后同样会生成 Gemfile.lock 文件。Ruby 静态代码分析既然已经决定写 Ruby 了,当然也要学会科学的写代码,经过灯塔左 的教育,知道了,这个工具会分析出不符合规范的 Ruby 代码,功能类似 OCLint。安装gem install rubocop配置在项目的 Gemfile 中加入下面一行即可。gem 'rubocop', '~& 0.49.1', require: false检测进入工程根目录,然后执行 rubocop 指令即可。自动修复除了能检测 Ruby 代码中不符合规范的部分,rubocop 还能通过 robocop -a 指令修复部分不符合规范的代码。作为一个小菜鸡,先简单用用吧。IDEIDE 我们选择用 Atom,因为目前只用过 Atom,所以也分析不出它和其他 Ruby 编辑器的优劣势,主要分享几个我觉得比较好用的插件吧。sync-settings这个插件由推荐,主要用于同步 Atom 的配置信息,只需要做简单的几个配置,就可以快速的在一台新电脑上部署自己熟悉的开发环境。关于 sync-settings 的使用,可以参考这篇文章:,内容很完整。platformio-ide-terminal这个插件可以让你在 Atom 中直接运行 Terminal。安装完成之后就可以在 Atom 底部的状态栏启动 Terminal 了。如下图:更详细的使用说明大家可以在 Atom 中查看 platformio-ide-terminal 的文档。面向对象的 Ruby对于入门 Ruby 的童鞋,有一个个人觉得很重要的点:不要用写 Shell 脚本的方式来写 Ruby,一定要用面向对象的思维方式来设计。辅助脚本编写根据之前在整理一文中整理的内容,目前已经完成了一键新建 feature、一键切换调试模式以及一键切换提交模式三个功能,并开源在 上,设计的思路如下:模块结构:start new feature 流程以及各步骤依赖的 util:switch to debug 流程以及各步骤依赖的 util:switch to push 流程以及各步骤依赖的 util:BigKeeper 目前也在持续完善的过程中,存在问题的地方欢迎大家直接在评论中进行指正,感谢~下面主要分享一些我在脚本编写过程中的收获。一些收获git 增强库:git-flow上篇文章中讲到,开发过程我们遵循 git-flow 的标准,所以我们在编写这些辅助脚本的时候需要找一个 git-flow 支持库。这里我们用 nvie 的库:安装使用 Homebrew。brew install git-flow基本用法初始化 git-flow 仓库git flow init [-d]展示/开始/结束 featuregit flow featuregit flow feature start &name& [&base&]git flow feature finish &name&注意:&base& 参数必须是 develop 分支的一个 commit 记录。push feature 分支到远端仓库/从远端仓库 pull feature 分支git flow feature publish &name&git flow feature pull &remote& &name&展示/开始/结束 releasegit flow releasegit flow release start &release& [&base&]git flow release finish &release&注意:&base& 参数必须是 develop 分支的一个 commit 记录。展示/开始/结束 hotfixgit flow hotfixgit flow hotfix start &release& [&base&]git flow hotfix finish &release&注意:&base& 参数必须是 master 分支的一个 commit 记录。展示/开始 supportgit flow supportgit flow support start &release& &base&注意:&base& 参数必须是 master 分支的一个 commit 记录。命令行参数解析库 - OptionParser一个用于命令行参数解析的库,只需要简单几行代码,即可完成命令提示、解析、报错等功能。下面是我写的一个例子:def switch_to_debug_parser& params = {}& OptionParser.new do |opts|& & opts.banner = 'Here is help messages of the switch to debug command.'& & params[:mainpath] = './'& & opts.on('-m',& & & & & & '--mainpath=MainPath',& & & & & & 'Path of the main project, end with /') do |main_path|& & & params[:main_path] = main_path& & end& & opts.on('-n',& & & & & & '--modulename=ModuleName',& & & & & & 'Name of the module in Podfile') do |module_name|& & & params[:module_name] = module_name& & end& & opts.on('-p',& & & & & & '--modulepath=ModulePath',& & & & & & 'Path of the module project') do |module_path|& & & params[:module_path] = module_path& & end& end.parse!& # 如果必填参数没有则抛出异常& raise OptionParser::MissingArgument if params[:module_name].nil?& raise OptionParser::MissingArgument if params[:module_path].nil?& paramsend字符串拼接当字符串中本身存在 ' 和 ' 两种字符时,我们可以用 %q 或者 %Q 的方式来拼接字符串,这样就不需要在 ' 和 ' 前面加 \ 了,如下:%Q(& pod #{module_name}, :git =& '#{source.base}', :branch =& '#{source.addition}')执行 Shell 指令Ruby 执行 Shell 的方式有很多种,我选择的是 IO 的方式:IO.popen(%Q(cd #{path}; git flow feature start #{feature_name})) { |f| puts f.gets }上面代码中的 #{path} 类似 Objective-C 中的 %@。这里有个坑,当执行的 Shell 指令的输出是多行时,需要注意 IO 管道提前关闭的情况,用下面的方式来输出 Shell 指令输出的内容。IO.popen(%Q(pod install --project-directory=#{main_path})) { |io|& io.each do |line|& & puts line& end}文件内容查找和修改如果我们需要对文件进行按行查找和内容替换,这里会有一个小小的坑:如果我们直接在当前文件直接进行操作,当更新的内容不是一行时,file.each_line do |line| 会出现异常。就像我们遍历数组插入或者删除中间的元素一样,我们通过引入临时文件的方式来解决这个问题。如下:def find_and_replace(podfile, module_name, module_type, source)& temp_file = Tempfile.new('.Podfile.tmp')& begin& & File.open(podfile, 'r') do |file|& & & file.each_line do |line|& & & & if line.include?module_name& & & & & temp_file.puts generate_module_config(module_name, module_type, source)& & & & else& & & & & temp_file.puts line& & & & end& & & end& & end& & temp_file.close& & FileUtils.mv(temp_file.path, podfile)& ensure& & temp_file.close& & temp_file.unlink& endend相对路径转绝对路径Ruby 自带这个功能,使用 File.expand_path 方法即可。参考资料Atom 使用教程:ATOM同步插件和配置,使用sync-settings:原文链接:/p/e7fad343f3b3著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
TA的最新馆藏
喜欢该文的人也喜欢由于经常在公司代码持续集成平台构建代码时候忘记更新版本号,经常浪费一次宝贵的(长长的)构建时间,现在Mac用的工具是 Cornerstone,可以支持 commit 前后执行脚本。所以写了这个脚本,在commit之后执行,用于自动更新版本号到svn。
1,保证在 terminal 下面可以正常使用 svn 命令提交目标项目代码
2,修改配置常量 TARGET_SRC_ROOT,TARGET_PROJECT_NAMES,TARGET_PLIST_FILES
3,根据自己项目需要修改 generate_version_code 逻辑
4,在Cornerstone 的 commit 界面将本脚本设置为提交后执行
# -*- coding: utf-8 -*-
import xml.etree.cElementTree as etree
import datetime
TARGET_SRC_ROOT = &../src&
TARGET_PROJECT_NAMES = [&Demo&]
TARGET_PLIST_FILES = [&Info1.plist&, &Info2.plist&]
def get_version_value_node(root):
dict_node = root.find(&dict&)
if not dict_node:
return False
version_key_node = None
version_value_node = None
for key_value_node in dict_node:
text = key_value_node.text
if text == &CFBundleVersion&:
version_key_node = key_value_node
if version_key_node is not None:
version_value_node = key_value_node
if version_value_node is None:
return version_value_node
def replace_version_code(file_path, old_version_code, new_version_code):
file_content = None
with open(file_path, &rb&) as file:
file_content = file.read()
if not isinstance(file_content, str):
return False
file_content = file_content.replace(old_version_code, new_version_code)
with open(file_path, &wb&) as file:
file.write(file_content)
return True
# 根据旧的版本号生成新的版本号
# 项目要求格式是 YYMMDD + Build,如
# 表示 2016 年 1 月 1 日 第二次构建的版本
def generate_version_code(old_version_code):
if not isinstance(old_version_code, str):
return None
if len(old_version_code) != 8:
return None
date_code = old_version_code[0:6]
build_code = old_version_code[6:]
int_build_code = int(build_code)
today = datetime.date.today()
new_date_code = today.strftime(&%Y%m%d&)
new_date_code = new_date_code[2:]
if new_date_code == date_code:
int_build_code += 1
int_build_code = 1
new_build_code = str(int_build_code).zfill(2)
new_version_code = new_date_code + new_build_code
return new_version_code
def update_version(plist_file_path):
if not isinstance(plist_file_path, str):
return False
xml_tree = etree.ElementTree(file=plist_file_path)
if not xml_tree:
return False
root = xml_tree.getroot()
version_value_node = get_version_value_node(root)
if version_value_node is None:
return False
version_code = version_value_node.text
if not isinstance(version_code, str):
return False
new_version_code = generate_version_code(version_code)
result = replace_version_code(plist_file_path, version_code, new_version_code)
return result
def file_log(message):
current_dir = os.path.realpath(os.path.dirname(__file__))
path = os.path.join(current_dir, &log.txt&)
with open(path, &a+&) as f:
f.write(message)
f.write(&\r\n&)
def commit_files(plist_files):
commit_command = &&&svn ci -m &* auto update version script& &&&
for plist_file in plist_files:
commit_command += '&' + plist_file + '& '
os.system(commit_command)
file_log(&exec command & + commit_command)
def main():
current_dir = os.path.realpath(os.path.dirname(__file__))
plist_files = []
for project_name in TARGET_PROJECT_NAMES:
path = os.path.join(TARGET_SRC_ROOT, project_name)
path = os.path.join(current_dir, path)
for plist_file in TARGET_PLIST_FILES:
plist_path = os.path.join(path, plist_file)
plist_path = os.path.abspath(plist_path)
update_version(plist_path)
plist_files.append(plist_path)
commit_files(plist_files)
if __name__ == '__main__':
本文已收录于以下专栏:
相关文章推荐
由于经常在公司代码持续集成平台构建代码时候忘记更新版本号,经常浪费一次宝贵的(长长的)构建时间,现在Mac用的工具是 Cornerstone,可以支持 commit 前后执行脚本。所以写了这个脚本,在...
早上朋友问我PHP文件 注视中 @version 提交版本后怎么才能自动更新!
这也是抛砖引玉,不只是包括PHP文件!css/js 后面的?v=缓存等都可以用这个方法
工具: Su...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
在我们使用应用时,一打开应用,如果此应用有新的版本,常常能在应用中给出提示,是否要更新此应用。所以,我们就来看看,版本更新是如何实现的。
苹果给了我们一个接口,能根据应用...
之前做过版本更新的功能 弹出一个对话框进行下载,感觉不太美观用户体验不好  后来看别人都直接在通知栏进行下载 今天刚好做这个功能 就想练练手
public class DownloadService ...
App 版本更新步骤:
1、checkUpdate()//检测版本是否需要更新
2、downLoadAPK()//下载新版本的APP
3、installAPK()//安装新版本
虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的。
首先说一下原理:
每个上架的苹果应用程序,都会有一个...
下面提供了两个方法:
方法一是封装了一个更新类;
方法二则是直接写在自己的Controller中的,耦合性比较高
底下有Demo,请自行下载方法一:
AYCheckManager *...
如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息。
当前运行版本信息可以通过info.plist文件中的bundle ver...
在我们使用应用时,一打开应用,如果此应用有新的版本,常常能在应用中给出提示,是否要更新此应用。所以,我们就来看看,版本更新是如何实现的。
苹果给了我们一个接口,能根据应用id请求一些关于应用...
苹果本来就自带版本更新,但是有些客户就要做版本更新。苹果提供了开放的接口
/lookup?id=appleID  // appleID App stor...
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【投稿】使用 fastlane 实现 iOS 持续集成
招聘信息:
简介持续集成是个“一次配置长期受益”的工作。但很多小公司都没有。以前在做Windows开发配置感觉简单一些,这次配置iOS的,感觉步骤还挺多。整理出来,分享给大家,不正确的地方请及时指正。本文主要使用fastlane配置iOS的持续集成,自动编译、打包出多个版本。最近转行iOS开发,首要任务是使用Jenkins(算是hudson的兄弟)配置iOS工程的持续集成。 查找各种资料后,整理出以下几个关键词。jenkins搭建。使用fastlane中提供的工具修改工程配置。gym 或 ipa 工具编译工程。目标配置一台电脑自动获取代码,并定时打包出以下版本的ipa文件。内部测试版本:使用标准开发者的Developer证书签名的ipa文件。公开测试版本:使用企业账户的Distribute InHouse证书签名的ipa文件。AppStore版本:使用标准开发者的AppStore证书签名的ipa文件。渠道版本:内部测试版本,但Info.plist中增加每个渠道的标示符(因为渠道例如fir.im会使用自己的证书重新签名ipa,因此侧部测试版本就可以)PS: 日补充,fir.im 不会重新签名ipa。保留每个版本的dSYM调试符号文件。源代码安装fastlane和shenzhen都需要gem安装,把gem更换为淘宝源。安装fastlanesudo&gem&install&fastlanefastlane是ruby编写,使用gem安装。安装shenzhen&&sudo&gem&install&shenzhen如果只使用了gym命令,而不使用ipa命令,可以不安装。示例步骤在xcodeproj文件同级目录下,执行fastlane&initfastlane 很强大,甚至能自动截图,自动提交AppStore审核,不过我只用最简单的打包功能。 这里会有一系列提问。*&Do&you&want&to&get&started...?&y
*&Do&you&have&everything&commited...&?&y
*&App&Identifier&(com.krausefx.app):&com.everettjf.fastlanedemo
*&Your&Apple&ID&():&
*&...&updates&to&the&App&Store&or&Apple&TestFlight?&(y/n)&n
*&Do&you&want&to&setup&'snapshot'...&n
*&Do&you&want&to&use&'sigh'...&n&(是否自动下载provisioning文件)
*&The&scheme&name&of&your&app:&fastlanetest&(如果就一个工程,也可不输入)上面有一步要输入AppleID,是因为fastlane(的一个工具sigh,这个字母是H)会自动下载对应的provisioning文件。自动下载provisioning文件,对于经常增加测试设备的Developer证书挺方便。不过,示例就不自动下载了。执行完成后,会在工程目录下生成fastlane文件夹。drwxr-xr-x&&&5&everettjf&&staff&&&170B&Sep&&8&22:32&fastlane
drwxr-xr-x&&10&everettjf&&staff&&&340B&Sep&&8&22:00&fastlanedemo
drwxr-xr-x&&&5&everettjf&&staff&&&170B&Sep&&8&22:38&fastlanedemo.xcodeproj
drwxr-xr-x&&&4&everettjf&&staff&&&136B&Sep&&8&22:00&fastlanedemoTests我们需要修改fastlane文件夹的两个配置文件:Appfile和Fastfile。(实际是ruby代码)1. 修改Appfileapp_identifier&"com.everettjf.fastlanedemo"
apple_id&""
for_lane&:inhouse&do
&&app_identifier&"com.everettjf.fastlanedemoqiye"
&&apple_id&""
end企业InHouse版本与AppStore的app_identifier、apple_id不同。 这里for_lane 就是为后面Fastfile中定义的:inhouse版本设置单独的信息。2. 修改Fastfile这个文件中要编写每个版本的编译和打包代码(Developer版本、AppStore版本、InHouse版本、多个渠道版本), 每个版本要经过以下几个步骤: - 修改版本号和build号(修改为外部传入的版本,例如:1.0.0和100)def&prepare_version(options)
&&&&#say&'version&number:'
&&&&#say&options[:version]
&&&&increment_version_number(
&&&&&&&&version_number:&options[:version],
&&&&&&&&xcodeproj:&PROJECT_FILE_PATH,
&&&&#say&'build&number:'
&&&&#say&options[:build]
&&&&increment_build_number(
&&&&&&&&build_number:&options[:build],
&&&&&&&&xcodeproj:&PROJECT_FILE_PATH,
end修改app identifier(就是bundle id,例如:com.everettjf.fastlanedemo)def&update_app_identifier(app_id)
&&&&update_info_plist(
&&&&&&&&xcodeproj:PROJECT_FILE_PATH&,
&&&&&&&&app_identifier:app_id,
&&&&&&&&plist_path:"#{PLIST_FILE_PATH}"
&&&&update_info_plist(
&&&&&&&&xcodeproj:PROJECT_FILE_PATH&,
&&&&&&&&app_identifier:app_id,
&&&&&&&&plist_path:"#{UNITTEST_PLIST_FILE_PATH}"
end修改签名的配置,配置对应的provision filedef&update_provision(typePrefix)
&&update_project_provisioning(
&&&&&&xcodeproj:PROJECT_FILE_PATH&,
&&&&&&profile:"./fastlane/provision/#{typePrefix}.mobileprovision",
end渠道版本修改Info.plist文件中对应的字符串def&set_info_plist_value(path,key,value)
&&sh&"/usr/libexec/PlistBuddy&-c&\"set&:#{key}&#{value}\"&#{path}"
def&set_channel_id(channelId)
&&&&set_info_plist_value(
&&&&&&&&"./../fastlanedemo/#{PLIST_FILE_PATH}",
&&&&&&&&'ChannelID',
&&&&&&&&"#{channelId}"
end编译打包为ipa这步使用了工具shenzhen,也可以使用fastlane推荐的gym。def&generate_ipa(typePrefix,options)
&&#say&'generate&ipa'
&&fullVersion&=&options[:version]&+&'.'&+&options[:build]
&&channelId&=&options[:channel_id]
&&&&&&configuration:"Release",
&&&&&&scheme:"#{SCHEME_NAME}",
&&&&&&destination:"./build",
&&&&&&ipa:"#{APP_NAME}_#{fullVersion}_#{typePrefix}.ipa",
&&&&&&archive:false
&&sh&"mv&./../build/#{APP_NAME}.app.dSYM.zip&./../build/#{APP_NAME}_#{fullVersion}_#{typePrefix}.app.dSYM.zip"
end3.?编写shell脚本#!/bin/sh
#&>&sh&build.sh&1.0.0&200
versionNumber=$1&#&1.0.0
buildNumber=$2&#&2000
rm&-rf&build
basicLanes="AdHoc&AppStore&Develop&InHouse"
for&laneName&in&$basicLanes
&&&&fastlane&$laneName&version:$versionNumber&build:$buildNumber
channelIds="fir&91"
for&channelId&in&$channelIds
&&&&fastlane&Channel&version:$versionNumber&build:$buildNumber&channel_id:$channelId
donesh&build.sh&1.0.0&100我们传入主版本号和一个自增的id(一般是jenkins的build number)。配置Jenkins有了能一键编译的脚本,让Jenkins在获取代码后,调用build.sh就可以了。安装brew&install&jenkins配置获取代码,获取代码后调用shell:sh&build.sh&1.0.0&${BUILD_NUMBER}苹果开发者证书配置假设我们有两个开发者账号,一个是标准开发者账户(99刀,个人或公司),一个是企业账户(299刀)。 - 标准开发者账户:Identifier中增加com.everettjf.fastlanedemo
Provisioning&Profiles中增加一个&iOS&Distribution(AdHoc&和&AppStore)&和&iOS&Development企业账户:Identifier中增加com.everettjf.fastlanedemoqiye
Provisioning&Profiles中增加一个&iOS&Distribution(AdInHouse)相关文档fastlane:shenzhen : 其他途径Jenkins的xcode插件:Jenkins有个xcode插件,网上有些文章,不过自己没有使用。不知道能否 动态的更换证书。一次编译多次签名:在没有使用fastlane之前,看到fastlane提供了一套工具集,就使用gym先编译 一个Developer证书签名的ipa,之后使用其他证书分别签名。重要补充安装jenkins的机器上的Xcode要导入开发者账户(存在私钥的账户信息,通过首次创建证书的电脑上的Xcode导出)文章首次发布于:everettjf.github.io
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量5547点击量4046点击量3713点击量3657点击量3251点击量3243点击量3231点击量3195点击量3116
&2016 Chukong Technologies,Inc.
京公网安备89开源中国在线工具
常用API文档索引
所有API文档(按字母排序):
更多API文档正在添加中...
在此填写您的意见信息:
Email邮箱: (必填)
您的建议和意见:在Android的Java程序里调用Ruby脚本 - ITeye问答
我从前是做.net的,对Java,尤其是Android下的Java,生态系统认识严重不足,很多事情都是站在.net开发者的角度思考问题。
老板要我带队做一个游戏项目,要求支持多种客户端(Windows Phone 7、IOS以及Android平台,郁闷)
对于游戏数据,初步采用XML,这个跨平台没有多少问题。
接下来是游戏运行的脚本语言:
1、对于Windows Phone 7,我从前是做.net的,这方面资料看得比较多,首先想到的就是使用Ruby作为游戏的脚本语言,因为Windows Phone 7下有IronRuby可以执行Ruby代码。
参考文章:
/b/ninma/archive//windows-phone7-ironruby.aspx
2、IOS,据说有MacRuby,这个还在确认……
2、对于Android,这个就郁闷了,Google了很久,发现有一个ASE的东东,可以运行脚本语言,但是,但是!我看到的例子都是单纯的用脚本语言写HelloWorld之类的东西!!而不是通过Android下的Java语言执行这些脚本。
对于Java,尤其是Android下的Java,我还是个超级新手,其生态系统认识严重不足,很多事情都是站在.net开发者的角度思考问题,因此,Android下的Java能不能直接调用一段Ruby脚本?效率如何?谢谢!
PS,顺便再问个问题,.net下的委托(delegate),提供了对函数的抽象,很好用,Java有没有类似的实现?非得用接口吗?
貌似java里没有C#这种委托(delegate)。
已解决问题
未解决问题}

我要回帖

更多关于 c 读取exe版本号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信