fir-cli 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +19 -16
- data/doc/build_ipa.md +9 -0
- data/fir-cli.gemspec +1 -0
- data/lib/fir/cli.rb +5 -3
- data/lib/fir/util/build_ipa.rb +110 -30
- data/lib/fir/util/config.rb +1 -0
- data/lib/fir/version.rb +1 -1
- data/lib/fir/xcode_wrapper.sh +29 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 273a3d4a1727d563e204dbdad7fc16e6c9763c08
|
4
|
+
data.tar.gz: dcd37c2d1bba37d0bbb5f770b9aaaede8cb37eef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9ac2d63c1d9fe1ec682a17a94964dd6a7460b90b2b70a5a8d10047bb1abf307ce6fd18bf952593bdd6e55cc45d0a5296114dd78292b2328ff1f7d9aaeb616b3
|
7
|
+
data.tar.gz: 021bdb6ed3dfd98aed9941eef21569cfb466e1c8a63a37a115052d366cade76432f0fca3ccd4a2e79935d9507c47f0b62ceebf147ce066ca59df1fd2f047bd8b
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,28 +1,31 @@
|
|
1
1
|
rvm:
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
- 1.9.2
|
3
|
+
- 1.9.3
|
4
|
+
- 2.0.0
|
5
|
+
- 2.1
|
6
|
+
- 2.2
|
7
|
+
- 2.3
|
8
|
+
- ruby-head
|
9
|
+
- rbx-2
|
10
|
+
- jruby
|
11
|
+
- jruby-head
|
12
12
|
matrix:
|
13
13
|
allow_failures:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
- rvm: ruby-head
|
15
|
+
- rvm: jruby
|
16
|
+
- rvm: jruby-head
|
17
|
+
- rvm: rbx-2
|
18
18
|
env:
|
19
|
+
matrix:
|
19
20
|
- USE_OFFICIAL_GEM_SOURCE=true
|
21
|
+
global:
|
22
|
+
secure: XiWKHPcQNB/mGv8Q5VuBqETS1bmYZ3t5xJkR/JFHrhWi30O+QWulMM5YjzkVawPjpUS/rtefDEASc4bN+a1iRVi6kf8fxjeKNFAzNc/hEKiPgANELf1JJgGAcz4oygzrH94Vqj90fuf6DoUh9r+IO+Z0PF39GL9GCnUjJeg+zao=
|
20
23
|
notifications:
|
21
24
|
recipients:
|
22
|
-
|
25
|
+
- hxy@fir.im
|
23
26
|
branches:
|
24
27
|
only:
|
25
|
-
|
28
|
+
- master
|
26
29
|
addons:
|
27
30
|
code_climate:
|
28
31
|
repo_token: 7158bd5d0218441524b8663790dd28edba8a870387ed000a1b56968e3315af2a
|
data/doc/build_ipa.md
CHANGED
@@ -15,6 +15,8 @@ Options:
|
|
15
15
|
-C, [--configuration=CONFIGURATION] # Use the build configuration NAME for building each target
|
16
16
|
-d, [--destination=DESTINATION] # Set the destinationspecifier
|
17
17
|
-t, [--target=TARGET] # Build the target specified by targetname
|
18
|
+
-E, [--export_method=METHOD] # for exportOptionsPlist method, ad-hoc as default
|
19
|
+
-O, [--optionPlistPath] # User defined exportOptionsPlist path
|
18
20
|
-f, [--profile=PROFILE] # Set the export provisioning profile
|
19
21
|
-o, [--output=OUTPUT] # IPA output path, the default is: BUILD_DIR/fir_build_ipa
|
20
22
|
-p, [--publish], [--no-publish] # true/false if publish to fir.im
|
@@ -55,3 +57,10 @@ Options:
|
|
55
57
|
```sh
|
56
58
|
$ fir build_ipa path/to/workspace -w -S <scheme name>
|
57
59
|
```
|
60
|
+
|
61
|
+
|
62
|
+
ChangeLog 1.6.0
|
63
|
+
|
64
|
+
- 支持 XCode 8.3 打包
|
65
|
+
* 新增参数 -E,指定 exportOptionsPlist plist 文件中的方法, 默认为 ad-hoc
|
66
|
+
* 用户可自定义 -exportOptionsPlist 中的 plist 路径
|
data/fir-cli.gemspec
CHANGED
data/lib/fir/cli.rb
CHANGED
@@ -29,13 +29,15 @@ module FIR
|
|
29
29
|
method_option :workspace, type: :boolean, aliases: '-w', desc: 'true/false if build workspace'
|
30
30
|
method_option :scheme, type: :string, aliases: '-S', desc: 'Set the scheme NAME if build workspace'
|
31
31
|
method_option :configuration, type: :string, aliases: '-C', desc: 'Use the build configuration NAME for building each target'
|
32
|
-
method_option :destination, type: :string, aliases: '-d', desc: 'Set the
|
33
|
-
method_option :target, type: :string, aliases: '-t', desc: 'Build the target specified by
|
32
|
+
method_option :destination, type: :string, aliases: '-d', desc: 'Set the destination specifier'
|
33
|
+
method_option :target, type: :string, aliases: '-t', desc: 'Build the target specified by target name'
|
34
|
+
method_option :export_method, type: :string, aliases: '-E', desc: 'for exportOptionsPlist method, ad-hoc as default'
|
35
|
+
method_option :optionPlistPath, type: :string, aliases: '-O', desc: 'User defined exportOptionsPlist path'
|
34
36
|
method_option :profile, type: :string, aliases: '-f', desc: 'Set the export provisioning profile'
|
35
37
|
method_option :output, type: :string, aliases: '-o', desc: 'IPA output path, the default is: BUILD_DIR/fir_build_ipa'
|
36
38
|
method_option :publish, type: :boolean, aliases: '-p', desc: 'true/false if publish to fir.im'
|
37
39
|
method_option :short, type: :string, aliases: '-s', desc: 'Set custom short link if publish to fir.im'
|
38
|
-
method_option :name, type: :string, aliases: '-n', desc: 'Set custom ipa name when
|
40
|
+
method_option :name, type: :string, aliases: '-n', desc: 'Set custom ipa name when built'
|
39
41
|
method_option :changelog, type: :string, aliases: '-c', desc: 'Set changelog if publish to fir.im'
|
40
42
|
method_option :qrcode, type: :boolean, aliases: '-Q', desc: 'Generate qrcode'
|
41
43
|
method_option :mapping, type: :boolean, aliases: '-M', desc: 'true/false if upload app mapping file to BugHD.com'
|
data/lib/fir/util/build_ipa.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'xcodeproj'
|
2
3
|
|
3
4
|
module FIR
|
4
5
|
module BuildIpa
|
@@ -7,7 +8,7 @@ module FIR
|
|
7
8
|
initialize_build_common_options(args, options)
|
8
9
|
|
9
10
|
@build_tmp_dir = Dir.mktmpdir
|
10
|
-
@build_cmd
|
11
|
+
@build_cmd = initialize_ipa_build_cmd(args, options)
|
11
12
|
|
12
13
|
logger_info_and_run_build_command
|
13
14
|
|
@@ -22,17 +23,32 @@ module FIR
|
|
22
23
|
|
23
24
|
def initialize_ipa_build_cmd(args, options)
|
24
25
|
@configuration = options[:configuration]
|
25
|
-
@target_name
|
26
|
-
@scheme_name
|
27
|
-
@profile_name
|
28
|
-
@destination
|
29
|
-
|
30
|
-
|
26
|
+
@target_name = options[:target]
|
27
|
+
@scheme_name = options[:scheme]
|
28
|
+
@profile_name = options[:profile]
|
29
|
+
@destination = options[:destination]
|
30
|
+
@export_method = options[:export_method] || 'ad-hoc'
|
31
|
+
@optionPlistPath = options[:optionPlistPath]
|
32
|
+
|
33
|
+
build_cmd = 'xcodebuild archive -sdk iphoneos'
|
31
34
|
build_cmd += initialize_xcode_build_path(options)
|
35
|
+
|
36
|
+
build_settings = find_build_setting
|
37
|
+
@team_id = build_settings['DEVELOPMENT_TEAM']
|
38
|
+
provisioning_profile_id = build_settings['PROVISIONING_PROFILE']
|
39
|
+
|
40
|
+
check_ios_scheme(@scheme_name)
|
41
|
+
build_cmd += " -scheme '#{@scheme_name}'" unless @scheme_name.blank?
|
32
42
|
build_cmd += " -configuration '#{@configuration}'" unless @configuration.blank?
|
33
|
-
|
34
|
-
build_cmd += " -
|
35
|
-
|
43
|
+
|
44
|
+
# build_cmd += " -target '#{@target_name}'" unless @target_name.blank?
|
45
|
+
|
46
|
+
# xcarchive name for build -exportArchive
|
47
|
+
@xcarchive_name = @scheme_name.nil? ? @target_name : @scheme_name + '.xcarchive'
|
48
|
+
@xcarchive_path = "#{@build_dir}/fir_build/#{@xcarchive_name}"
|
49
|
+
|
50
|
+
build_cmd += " -archivePath #{@xcarchive_path}"
|
51
|
+
build_cmd += " PROVISIONING_PROFILE='#{provisioning_profile_id}'"
|
36
52
|
build_cmd += " #{ipa_custom_settings(args)} 2>&1"
|
37
53
|
build_cmd
|
38
54
|
end
|
@@ -40,7 +56,7 @@ module FIR
|
|
40
56
|
def ipa_custom_settings(args)
|
41
57
|
custom_settings = split_assignment_array_to_hash(args)
|
42
58
|
|
43
|
-
setting_str =
|
59
|
+
setting_str = convert_hash_to_assignment_string(custom_settings)
|
44
60
|
setting_str += " TARGET_BUILD_DIR='#{@build_tmp_dir}'" unless custom_settings['TARGET_BUILD_DIR']
|
45
61
|
setting_str += " CONFIGURATION_BUILD_DIR='#{@build_tmp_dir}'" unless custom_settings['CONFIGURATION_BUILD_DIR']
|
46
62
|
setting_str += " DWARF_DSYM_FOLDER_PATH='#{@output_path}'" unless custom_settings['DWARF_DSYM_FOLDER_PATH']
|
@@ -49,16 +65,15 @@ module FIR
|
|
49
65
|
|
50
66
|
def output_ipa_and_dsym
|
51
67
|
apps = Dir["#{@build_tmp_dir}/*.app"].sort_by(&:size)
|
52
|
-
check_no_output_app(apps)
|
68
|
+
# check_no_output_app(apps)
|
53
69
|
|
54
70
|
@temp_ipa = "#{@build_tmp_dir}/#{Time.now.to_i}.ipa"
|
55
71
|
archive_ipa(apps)
|
56
72
|
|
57
|
-
check_archived_ipa_is_exist
|
73
|
+
# check_archived_ipa_is_exist
|
58
74
|
rename_ipa_and_dsym
|
59
75
|
|
60
76
|
FileUtils.rm_rf(@build_tmp_dir) unless $DEBUG
|
61
|
-
|
62
77
|
logger.info 'Build Success'
|
63
78
|
end
|
64
79
|
|
@@ -66,7 +81,13 @@ module FIR
|
|
66
81
|
logger.info 'Archiving......'
|
67
82
|
logger_info_dividing_line
|
68
83
|
|
69
|
-
|
84
|
+
option_plist_path = @optionPlistPath || gen_option_plist
|
85
|
+
|
86
|
+
@xcrun_cmd = "#{FIR::Config::XCODE_WRAPPER_PATH} -exportArchive"
|
87
|
+
@xcrun_cmd += " -archivePath #{@xcarchive_path}"
|
88
|
+
@xcrun_cmd += " -exportOptionsPlist #{option_plist_path}"
|
89
|
+
@xcrun_cmd += " -exportPath #{@build_dir}/fir_build"
|
90
|
+
|
70
91
|
puts @xcrun_cmd if $DEBUG
|
71
92
|
logger.info `#{@xcrun_cmd}`
|
72
93
|
end
|
@@ -78,18 +99,80 @@ module FIR
|
|
78
99
|
end
|
79
100
|
end
|
80
101
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
102
|
+
def gen_option_plist
|
103
|
+
plist = "
|
104
|
+
<plist version=\"1.0\">
|
105
|
+
<dict>
|
106
|
+
<key>teamID</key>
|
107
|
+
<string>#{@team_id}</string>
|
108
|
+
<key>method</key>
|
109
|
+
<string>#{@export_method}</string>
|
110
|
+
<key>uploadSymbols</key>
|
111
|
+
<true/>
|
112
|
+
<key>compileBitcode</key>
|
113
|
+
<false/>
|
114
|
+
<key>uploadBitcode</key>
|
115
|
+
<false/>
|
116
|
+
</dict>
|
117
|
+
</plist>"
|
118
|
+
|
119
|
+
logger.info 'Generated plist file for exportOptionsPlist argument'
|
120
|
+
logger.info "{"
|
121
|
+
logger.info " teamID:#{@team_id}" unless @team_id.nil?
|
122
|
+
logger.info " method:#{@export_method}"
|
123
|
+
logger.info " uploadSymbols:true"
|
124
|
+
logger.info " uploadBitcode:false"
|
125
|
+
logger.info "}"
|
126
|
+
|
127
|
+
begin
|
128
|
+
plist_path = "#{@build_dir}/fir_build/exportOptions.plist"
|
129
|
+
file = File.open(plist_path, "w")
|
130
|
+
file.write(plist)
|
131
|
+
plist_path
|
132
|
+
rescue IOError => e
|
133
|
+
raise e
|
134
|
+
ensure
|
135
|
+
file.close unless file.nil?
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Find build setting from xcode project by target and configuration
|
140
|
+
def find_build_setting
|
141
|
+
project = Xcodeproj::Project.open(@xc_project)
|
84
142
|
|
143
|
+
# find target
|
144
|
+
used_target = project.targets[0]
|
145
|
+
if @target_name
|
146
|
+
project.targets.each do |target|
|
147
|
+
if target.name == @target_name
|
148
|
+
used_target = target
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# find configuration settings
|
154
|
+
used_target.build_configurations.each do |config|
|
155
|
+
if config.name == @configuration
|
156
|
+
return config.build_settings
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
logger.info "configuration '#{@configuration}' not found"
|
161
|
+
end
|
162
|
+
|
163
|
+
def rename_ipa_and_dsym
|
85
164
|
if @name.blank?
|
86
165
|
@ipa_name = "#{ipa_info[:name]}-#{ipa_info[:version]}-build-#{ipa_info[:build]}"
|
87
166
|
else
|
88
167
|
@ipa_name = @name
|
89
168
|
end
|
90
169
|
|
170
|
+
@temp_ipa = "#{@build_dir}/fir_build/#{@scheme_name}.ipa"
|
91
171
|
@builded_app_path = "#{@output_path}/#{@ipa_name}.ipa"
|
92
172
|
|
173
|
+
ipa_info = FIR.ipa_info(@temp_ipa)
|
174
|
+
dsym_name = " #{@output_path}/#{ipa_info[:name]}.app.dSYM"
|
175
|
+
|
93
176
|
FileUtils.mv(@temp_ipa, @builded_app_path, force: true)
|
94
177
|
if File.exist?(dsym_name)
|
95
178
|
FileUtils.mv(dsym_name, "#{@output_path}/#{@ipa_name}.app.dSYM", force: true)
|
@@ -99,25 +182,22 @@ module FIR
|
|
99
182
|
def upload_build_dsym_mapping_file
|
100
183
|
logger_info_blank_line
|
101
184
|
|
102
|
-
@app_info
|
185
|
+
@app_info = ipa_info(@builded_app_path)
|
103
186
|
@mapping_file = Dir["#{@output_path}/#{@ipa_name}.app.dSYM/Contents/Resources/DWARF/*"].first
|
104
187
|
|
105
|
-
mapping @mapping_file, proj:
|
106
|
-
|
107
|
-
|
108
|
-
|
188
|
+
mapping @mapping_file, proj: @proj,
|
189
|
+
build: @app_info[:build],
|
190
|
+
version: @app_info[:version],
|
191
|
+
token: @token
|
109
192
|
end
|
110
193
|
|
111
194
|
def initialize_xcode_build_path(options)
|
112
195
|
if options.workspace?
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
return " -workspace '#{workspace}' -scheme '#{@scheme_name}'"
|
196
|
+
@xc_workspace = check_and_find_ios_xcworkspace(@build_dir)
|
197
|
+
" -workspace '#{@xc_workspace}'"
|
117
198
|
else
|
118
|
-
|
119
|
-
|
120
|
-
return " -project '#{project}'"
|
199
|
+
@xc_project = check_and_find_ios_xcodeproj(@build_dir)
|
200
|
+
" -project '#{@xc_project}'"
|
121
201
|
end
|
122
202
|
end
|
123
203
|
|
data/lib/fir/util/config.rb
CHANGED
@@ -5,6 +5,7 @@ module FIR
|
|
5
5
|
CONFIG_PATH = "#{ENV['HOME']}/.fir-cli"
|
6
6
|
APP_INFO_PATH = "#{ENV['HOME']}/.fir-cli-app"
|
7
7
|
API_YML_PATH = File.expand_path('../../', __FILE__) + '/api.yml'
|
8
|
+
XCODE_WRAPPER_PATH = File.expand_path('../../', __FILE__) + '/xcode_wrapper.sh'
|
8
9
|
APP_FILE_TYPE = %w(.ipa .apk).freeze
|
9
10
|
|
10
11
|
def fir_api
|
data/lib/fir/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
#!/bin/bash --login
|
4
|
+
|
5
|
+
which rvm > /dev/null
|
6
|
+
|
7
|
+
if [[ $? -eq 0 ]]; then
|
8
|
+
echo "RVM detected, forcing to use system ruby since xcodebuild cause error"
|
9
|
+
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
|
10
|
+
rvm use system
|
11
|
+
fi
|
12
|
+
|
13
|
+
if which rbenv > /dev/null; then
|
14
|
+
echo "rbenv detected, removing env variables since xcodebuild cause error"
|
15
|
+
rbenv shell system
|
16
|
+
fi
|
17
|
+
|
18
|
+
shell_session_update() { :; }
|
19
|
+
|
20
|
+
unset RUBYLIB
|
21
|
+
unset RUBYOPT
|
22
|
+
unset BUNDLE_BIN_PATH
|
23
|
+
unset _ORIGINAL_GEM_PATH
|
24
|
+
unset BUNDLE_GEMFILE
|
25
|
+
unset GEM_HOME
|
26
|
+
unset GEM_PATH
|
27
|
+
|
28
|
+
set -x
|
29
|
+
xcodebuild "$@"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fir-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NaixSpirit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.7'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: xcodeproj
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.4'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '1.4'
|
139
153
|
description: fir.im command tool, support iOS and Android
|
140
154
|
email:
|
141
155
|
- neverlandxy.naix@gmail.com
|
@@ -197,6 +211,7 @@ files:
|
|
197
211
|
- lib/fir/util/parser/pngcrush.rb
|
198
212
|
- lib/fir/util/publish.rb
|
199
213
|
- lib/fir/version.rb
|
214
|
+
- lib/fir/xcode_wrapper.sh
|
200
215
|
- lib/fir_cli.rb
|
201
216
|
- test/build_ipa_test.rb
|
202
217
|
- test/cases/test_apk.apk
|
@@ -234,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
249
|
version: '0'
|
235
250
|
requirements: []
|
236
251
|
rubyforge_project:
|
237
|
-
rubygems_version: 2.6.
|
252
|
+
rubygems_version: 2.6.8
|
238
253
|
signing_key:
|
239
254
|
specification_version: 4
|
240
255
|
summary: fir.im command tool
|