pindo 5.13.9 → 5.13.10
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/lib/pindo/base/git_handler.rb +247 -42
- data/lib/pindo/command/android/autobuild.rb +72 -30
- data/lib/pindo/command/android/autoresign.rb +23 -322
- data/lib/pindo/command/android/keystore.rb +7 -130
- data/lib/pindo/command/appstore/adhocbuild.rb +5 -14
- data/lib/pindo/command/appstore/autobuild.rb +64 -14
- data/lib/pindo/command/appstore/autoresign.rb +1 -3
- data/lib/pindo/command/ios/autobuild.rb +71 -53
- data/lib/pindo/command/ios/build.rb +8 -186
- data/lib/pindo/command/jps/media.rb +146 -0
- data/lib/pindo/command/jps/upload.rb +48 -20
- data/lib/pindo/command/jps.rb +1 -0
- data/lib/pindo/command/unity/autobuild.rb +99 -27
- data/lib/pindo/command/unity/packpush.rb +5 -8
- data/lib/pindo/command/utils/repoinit.rb +0 -2
- data/lib/pindo/command/utils/tag.rb +58 -26
- data/lib/pindo/command/utils.rb +0 -1
- data/lib/pindo/command/web/autobuild.rb +71 -37
- data/lib/pindo/command.rb +0 -56
- data/lib/pindo/config/build_info_manager.rb +7 -8
- data/lib/pindo/module/android/android_config_helper.rb +2 -11
- data/lib/pindo/module/appselect.rb +15 -41
- data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
- data/lib/pindo/module/build/build_helper.rb +28 -18
- data/lib/pindo/module/build/git_repo_helper.rb +284 -405
- data/lib/pindo/module/cert/pem_helper.rb +3 -6
- data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
- data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
- data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
- data/lib/pindo/module/task/model/build_task.rb +8 -11
- data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
- data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
- data/lib/pindo/module/task/model/git_task.rb +75 -0
- data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
- data/lib/pindo/module/task/model/{resign → jps}/jps_resign_task.rb +13 -22
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
- data/lib/pindo/module/task/model/jps/jps_upload_task.rb +38 -93
- data/lib/pindo/module/task/model/jps_task.rb +43 -0
- data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
- data/lib/pindo/module/task/model/unity/unity_config_task.rb +0 -4
- data/lib/pindo/module/task/model/unity/unity_export_task.rb +8 -7
- data/lib/pindo/module/task/model/unity/unity_update_task.rb +4 -3
- data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +8 -7
- data/lib/pindo/module/task/model/unity_task.rb +7 -2
- data/lib/pindo/module/task/pindo_task.rb +101 -1
- data/lib/pindo/module/task/task_manager.rb +29 -32
- data/lib/pindo/module/unity/nuget_helper.rb +7 -7
- data/lib/pindo/options/core/global_options_state.rb +96 -26
- data/lib/pindo/options/core/option_configuration.rb +3 -0
- data/lib/pindo/options/core/option_item.rb +36 -0
- data/lib/pindo/options/groups/build_options.rb +23 -6
- data/lib/pindo/options/groups/git_options.rb +115 -0
- data/lib/pindo/options/groups/jps_options.rb +7 -0
- data/lib/pindo/options/groups/option_group.rb +15 -0
- data/lib/pindo/options/groups/unity_options.rb +49 -0
- data/lib/pindo/options/options.rb +2 -0
- data/lib/pindo/version.rb +2 -2
- metadata +15 -11
- data/lib/pindo/base/githelper.rb +0 -686
- data/lib/pindo/base/pindocontext.rb +0 -602
- data/lib/pindo/command/utils/feishu.rb +0 -134
- data/lib/pindo/module/build/version_helper.rb +0 -146
- data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
|
@@ -1,332 +1,33 @@
|
|
|
1
|
-
require 'highline/import'
|
|
2
|
-
require 'fileutils'
|
|
3
|
-
require 'pindo/base/executable'
|
|
4
|
-
|
|
5
1
|
module Pindo
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
include Appselect
|
|
11
|
-
|
|
12
|
-
self.summary = 'APK包重签名工具'
|
|
13
|
-
|
|
14
|
-
self.description = <<-DESC
|
|
15
|
-
使用指定的keystore重新签名APK包。
|
|
16
|
-
|
|
17
|
-
支持功能:
|
|
18
|
-
|
|
19
|
-
* 自动查找APK文件
|
|
20
|
-
|
|
21
|
-
* 使用debug或release keystore签名
|
|
22
|
-
|
|
23
|
-
* 支持指定APK路径
|
|
24
|
-
|
|
25
|
-
* 支持上传到JPS测试平台
|
|
26
|
-
|
|
27
|
-
* 支持发送测试通知
|
|
28
|
-
|
|
29
|
-
* 自动zipalign优化
|
|
30
|
-
|
|
31
|
-
使用示例:
|
|
32
|
-
|
|
33
|
-
$ pindo and autoresign # 重签名当前目录下的APK
|
|
34
|
-
|
|
35
|
-
$ pindo and autoresign demo.apk # 重签名指定APK文件
|
|
36
|
-
|
|
37
|
-
$ pindo and autoresign --release # 使用release keystore签名
|
|
38
|
-
|
|
39
|
-
$ pindo and autoresign --adhoc # 使用adhoc keystore签名
|
|
40
|
-
|
|
41
|
-
$ pindo and autoresign --upload # 重签名并上传到JPS
|
|
42
|
-
|
|
43
|
-
$ pindo and autoresign --send # 重签名、上传并发送通知
|
|
44
|
-
DESC
|
|
45
|
-
|
|
46
|
-
self.arguments = [
|
|
47
|
-
CLAide::Argument.new('path/to/demo.apk', true),
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
def self.options
|
|
51
|
-
[
|
|
52
|
-
['--apk', '指定要重签名的APK文件路径'],
|
|
53
|
-
['--release', '使用release keystore签名'],
|
|
54
|
-
['--adhoc', '使用adhoc keystore签名(默认)'],
|
|
55
|
-
['--proj', '指定上传到测试平台的项目名称'],
|
|
56
|
-
['--upload', '上传重签名后的APK到测试平台'],
|
|
57
|
-
['--send', '上传成功后发送测试通知'],
|
|
58
|
-
].concat(super)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def initialize(argv)
|
|
62
|
-
@args_apk_file = argv.shift_argument
|
|
63
|
-
@args_set_apk_name = argv.option('apk')
|
|
64
|
-
@args_release_flag = argv.flag?('release', false)
|
|
65
|
-
@args_adhoc_flag = argv.flag?('adhoc', true)
|
|
66
|
-
|
|
67
|
-
@args_upload_flag = argv.flag?('upload', false)
|
|
68
|
-
@args_send_flag = argv.flag?('send', false)
|
|
69
|
-
@args_proj_name = argv.option('proj')
|
|
70
|
-
|
|
71
|
-
if @args_send_flag
|
|
72
|
-
@args_upload_flag = true
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
super
|
|
76
|
-
@additional_args = argv.remainder!
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def run
|
|
80
|
-
# 查找APK文件
|
|
81
|
-
apk_file_name = find_apk_file
|
|
82
|
-
|
|
83
|
-
if apk_file_name.nil? || !File.exist?(apk_file_name)
|
|
84
|
-
Funlog.instance.fancyinfo_error("未找到APK文件")
|
|
85
|
-
return
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
puts
|
|
89
|
-
puts "正在重签名的APK: #{apk_file_name}"
|
|
90
|
-
puts "文件大小: #{(File.size(apk_file_name) / 1024.0 / 1024.0).round(2)} MB"
|
|
91
|
-
puts "修改时间: #{File.mtime(apk_file_name)}"
|
|
92
|
-
puts
|
|
93
|
-
|
|
94
|
-
# 获取keystore配置
|
|
95
|
-
keystore_info = get_keystore_info
|
|
96
|
-
|
|
97
|
-
if keystore_info.nil?
|
|
98
|
-
Funlog.instance.fancyinfo_error("无法获取keystore配置")
|
|
99
|
-
return
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# 执行重签名
|
|
103
|
-
resigned_apk = resign_apk(apk_file_name, keystore_info)
|
|
104
|
-
|
|
105
|
-
if resigned_apk.nil?
|
|
106
|
-
Funlog.instance.fancyinfo_error("重签名失败")
|
|
107
|
-
return
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
puts
|
|
111
|
-
Funlog.instance.fancyinfo_success("重签名成功: #{resigned_apk}")
|
|
112
|
-
puts
|
|
113
|
-
|
|
114
|
-
# 上传到JPS
|
|
115
|
-
if @args_upload_flag
|
|
116
|
-
upload_to_jps(resigned_apk)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
2
|
+
class Command
|
|
3
|
+
class Android < Command
|
|
4
|
+
class Autoresign < Android
|
|
119
5
|
|
|
120
|
-
|
|
6
|
+
# TODO: 待实现
|
|
7
|
+
self.summary = 'APK包重签名工具(暂未实现)'
|
|
121
8
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if !@args_set_apk_name.nil?
|
|
125
|
-
apk_file_name = @args_set_apk_name
|
|
126
|
-
end
|
|
9
|
+
self.description = <<-DESC
|
|
10
|
+
使用指定的keystore重新签名APK包。
|
|
127
11
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
end
|
|
12
|
+
注意: 此命令暂未实现。
|
|
13
|
+
DESC
|
|
131
14
|
|
|
132
|
-
|
|
133
|
-
current_dir = Dir.pwd
|
|
134
|
-
apk_files = Dir.glob(File.join(current_dir, "*.apk"))
|
|
15
|
+
self.arguments = []
|
|
135
16
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
Time.local(0, 1, 1)
|
|
140
|
-
else
|
|
141
|
-
File.mtime(f)
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
return apk_file_name
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def get_keystore_info
|
|
149
|
-
# 根据参数确定使用哪个keystore
|
|
150
|
-
keystore_type = @args_release_flag ? "release" : "adhoc"
|
|
151
|
-
|
|
152
|
-
# 从配置中获取keystore信息
|
|
153
|
-
config_json = load_config_json
|
|
154
|
-
return nil if config_json.nil?
|
|
155
|
-
|
|
156
|
-
keystore_info = {}
|
|
157
|
-
|
|
158
|
-
if keystore_type == "release"
|
|
159
|
-
keystore_info[:path] = config_json['app_android_keystore_release']
|
|
160
|
-
keystore_info[:password] = config_json['app_android_keystore_release_password']
|
|
161
|
-
keystore_info[:alias] = config_json['app_android_keystore_release_alias']
|
|
162
|
-
keystore_info[:alias_password] = config_json['app_android_keystore_release_alias_password']
|
|
163
|
-
else
|
|
164
|
-
keystore_info[:path] = config_json['app_android_keystore_adhoc']
|
|
165
|
-
keystore_info[:password] = config_json['app_android_keystore_adhoc_password']
|
|
166
|
-
keystore_info[:alias] = config_json['app_android_keystore_adhoc_alias']
|
|
167
|
-
keystore_info[:alias_password] = config_json['app_android_keystore_adhoc_alias_password']
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
# 验证keystore文件存在
|
|
171
|
-
if keystore_info[:path].nil? || !File.exist?(keystore_info[:path])
|
|
172
|
-
Funlog.instance.fancyinfo_error("Keystore文件不存在: #{keystore_info[:path]}")
|
|
173
|
-
return nil
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
puts "使用Keystore: #{keystore_info[:path]}"
|
|
177
|
-
puts "Keystore类型: #{keystore_type}"
|
|
178
|
-
|
|
179
|
-
return keystore_info
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def resign_apk(apk_file, keystore_info)
|
|
183
|
-
# 准备输出文件名
|
|
184
|
-
base_name = File.basename(apk_file, ".apk")
|
|
185
|
-
output_dir = File.dirname(apk_file)
|
|
186
|
-
|
|
187
|
-
# 生成临时文件名
|
|
188
|
-
unsigned_apk = File.join(output_dir, "#{base_name}_unsigned.apk")
|
|
189
|
-
aligned_apk = File.join(output_dir, "#{base_name}_aligned.apk")
|
|
190
|
-
resigned_apk = File.join(output_dir, "#{base_name}_resigned.apk")
|
|
191
|
-
|
|
192
|
-
begin
|
|
193
|
-
# 1. 移除原有签名
|
|
194
|
-
puts "1. 移除原有签名..."
|
|
195
|
-
FileUtils.cp(apk_file, unsigned_apk)
|
|
196
|
-
system("zip -d \"#{unsigned_apk}\" META-INF/\\* > /dev/null 2>&1")
|
|
197
|
-
|
|
198
|
-
# 2. zipalign优化
|
|
199
|
-
puts "2. 执行zipalign优化..."
|
|
200
|
-
zipalign_cmd = "zipalign -v 4 \"#{unsigned_apk}\" \"#{aligned_apk}\""
|
|
201
|
-
|
|
202
|
-
if !system(zipalign_cmd)
|
|
203
|
-
# 如果zipalign失败,尝试使用Android SDK中的zipalign
|
|
204
|
-
android_home = ENV['ANDROID_HOME'] || ENV['ANDROID_SDK_ROOT']
|
|
205
|
-
if android_home
|
|
206
|
-
build_tools_dir = Dir.glob(File.join(android_home, "build-tools", "*")).max
|
|
207
|
-
if build_tools_dir
|
|
208
|
-
zipalign_path = File.join(build_tools_dir, "zipalign")
|
|
209
|
-
if File.exist?(zipalign_path)
|
|
210
|
-
zipalign_cmd = "\"#{zipalign_path}\" -v 4 \"#{unsigned_apk}\" \"#{aligned_apk}\""
|
|
211
|
-
system(zipalign_cmd)
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
else
|
|
215
|
-
# 如果没有zipalign,直接使用未对齐的APK
|
|
216
|
-
FileUtils.cp(unsigned_apk, aligned_apk)
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
# 3. 使用apksigner重新签名
|
|
221
|
-
puts "3. 重新签名APK..."
|
|
222
|
-
apksigner_cmd = [
|
|
223
|
-
"apksigner", "sign",
|
|
224
|
-
"--ks", keystore_info[:path],
|
|
225
|
-
"--ks-pass", "pass:#{keystore_info[:password]}",
|
|
226
|
-
"--ks-key-alias", keystore_info[:alias],
|
|
227
|
-
"--key-pass", "pass:#{keystore_info[:alias_password]}",
|
|
228
|
-
"--out", resigned_apk,
|
|
229
|
-
aligned_apk
|
|
230
|
-
].join(" ")
|
|
231
|
-
|
|
232
|
-
if !system(apksigner_cmd)
|
|
233
|
-
# 如果apksigner失败,尝试使用jarsigner
|
|
234
|
-
puts "尝试使用jarsigner..."
|
|
235
|
-
jarsigner_cmd = [
|
|
236
|
-
"jarsigner",
|
|
237
|
-
"-verbose",
|
|
238
|
-
"-sigalg", "SHA256withRSA",
|
|
239
|
-
"-digestalg", "SHA-256",
|
|
240
|
-
"-keystore", keystore_info[:path],
|
|
241
|
-
"-storepass", keystore_info[:password],
|
|
242
|
-
"-keypass", keystore_info[:alias_password],
|
|
243
|
-
aligned_apk,
|
|
244
|
-
keystore_info[:alias]
|
|
245
|
-
].join(" ")
|
|
246
|
-
|
|
247
|
-
if system(jarsigner_cmd)
|
|
248
|
-
FileUtils.mv(aligned_apk, resigned_apk)
|
|
249
|
-
else
|
|
250
|
-
Funlog.instance.fancyinfo_error("签名失败")
|
|
251
|
-
return nil
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
# 4. 验证签名
|
|
256
|
-
puts "4. 验证签名..."
|
|
257
|
-
verify_cmd = "apksigner verify \"#{resigned_apk}\""
|
|
258
|
-
if !system(verify_cmd)
|
|
259
|
-
# 尝试使用jarsigner验证
|
|
260
|
-
system("jarsigner -verify \"#{resigned_apk}\"")
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
return resigned_apk
|
|
264
|
-
|
|
265
|
-
ensure
|
|
266
|
-
# 清理临时文件
|
|
267
|
-
FileUtils.rm_f(unsigned_apk) if File.exist?(unsigned_apk)
|
|
268
|
-
FileUtils.rm_f(aligned_apk) if File.exist?(aligned_apk)
|
|
269
|
-
end
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
def upload_to_jps(apk_file)
|
|
273
|
-
# 上传到JPS平台
|
|
274
|
-
Funlog.instance.fancyinfo_start("开始上传到JPS测试平台...")
|
|
275
|
-
|
|
276
|
-
upload_params = [apk_file]
|
|
277
|
-
upload_params << "--proj=#{@args_proj_name}" if @args_proj_name
|
|
278
|
-
upload_params << "--send" if @args_send_flag
|
|
279
|
-
|
|
280
|
-
# 调用jps upload命令
|
|
281
|
-
Pindo::Command::Jps::Upload.run(upload_params)
|
|
282
|
-
|
|
283
|
-
Funlog.instance.fancyinfo_success("上传完成")
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
def load_config_json
|
|
287
|
-
# 查找并加载配置文件
|
|
288
|
-
config_file = find_config_file
|
|
289
|
-
return nil if config_file.nil?
|
|
290
|
-
|
|
291
|
-
begin
|
|
292
|
-
config_json = JSON.parse(File.read(config_file))
|
|
293
|
-
return config_json
|
|
294
|
-
rescue => e
|
|
295
|
-
Funlog.instance.fancyinfo_error("解析配置文件失败: #{e.message}")
|
|
296
|
-
return nil
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
def find_config_file
|
|
301
|
-
current_dir = Dir.pwd
|
|
302
|
-
|
|
303
|
-
# 查找顺序:当前目录 -> 父目录(向上查找)
|
|
304
|
-
while current_dir != "/"
|
|
305
|
-
config_file = File.join(current_dir, "config.json")
|
|
306
|
-
if File.exist?(config_file)
|
|
307
|
-
return config_file
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
# 检查.pindo目录
|
|
311
|
-
pindo_config = File.join(current_dir, ".pindo", "config.json")
|
|
312
|
-
if File.exist?(pindo_config)
|
|
313
|
-
return pindo_config
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
current_dir = File.dirname(current_dir)
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
# 使用默认配置
|
|
320
|
-
default_config = pindo_single_config.app_config_dir
|
|
321
|
-
if default_config && File.exist?(default_config)
|
|
322
|
-
config_file = File.join(default_config, "config.json")
|
|
323
|
-
return config_file if File.exist?(config_file)
|
|
324
|
-
end
|
|
17
|
+
def self.options
|
|
18
|
+
[].concat(super)
|
|
19
|
+
end
|
|
325
20
|
|
|
326
|
-
|
|
327
|
-
|
|
21
|
+
def initialize(argv)
|
|
22
|
+
super
|
|
23
|
+
end
|
|
328
24
|
|
|
329
|
-
|
|
25
|
+
def run
|
|
26
|
+
# TODO: 待实现
|
|
27
|
+
raise Informative, "pindo android autoresign 命令暂未实现"
|
|
330
28
|
end
|
|
29
|
+
|
|
30
|
+
end
|
|
331
31
|
end
|
|
332
|
-
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -1,153 +1,30 @@
|
|
|
1
|
-
require 'fileutils'
|
|
2
|
-
|
|
3
1
|
module Pindo
|
|
4
2
|
class Command
|
|
5
3
|
class Android < Command
|
|
6
4
|
class Keystore < Android
|
|
7
5
|
|
|
8
|
-
#
|
|
9
|
-
self.summary = 'Android签名密钥(keystore)
|
|
6
|
+
# TODO: 待实现
|
|
7
|
+
self.summary = 'Android签名密钥(keystore)管理工具(暂未实现)'
|
|
10
8
|
|
|
11
|
-
# 详细说明
|
|
12
9
|
self.description = <<-DESC
|
|
13
10
|
Android签名密钥(keystore)管理和配置工具。
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* 管理Debug和Release签名密钥
|
|
18
|
-
|
|
19
|
-
* 配置工程签名设置
|
|
20
|
-
|
|
21
|
-
* 支持AdHoc模式签名
|
|
22
|
-
|
|
23
|
-
* 从配置仓库获取签名文件
|
|
24
|
-
|
|
25
|
-
使用示例:
|
|
26
|
-
|
|
27
|
-
$ pindo android keystore # 使用Debug模式签名
|
|
28
|
-
|
|
29
|
-
$ pindo android keystore --release # 使用Release模式签名
|
|
30
|
-
|
|
31
|
-
$ pindo android keystore --adhoc # 使用AdHoc模式签名
|
|
12
|
+
注意: 此命令暂未实现,请使用 pindo android autobuild 命令。
|
|
32
13
|
DESC
|
|
33
14
|
|
|
34
|
-
|
|
35
|
-
self.arguments = [
|
|
36
|
-
# 暂无参数
|
|
37
|
-
]
|
|
15
|
+
self.arguments = []
|
|
38
16
|
|
|
39
|
-
# 命令选项
|
|
40
17
|
def self.options
|
|
41
|
-
[
|
|
42
|
-
['--adhoc', '使用adhoc模式'],
|
|
43
|
-
['--release', '使用release模式'],
|
|
44
|
-
].concat(super)
|
|
18
|
+
[].concat(super)
|
|
45
19
|
end
|
|
46
20
|
|
|
47
21
|
def initialize(argv)
|
|
48
|
-
@args_release_flag = argv.flag?('release', false)
|
|
49
|
-
@upload_flag = argv.flag?('upload', false)
|
|
50
|
-
@send_flag = argv.flag?('send', false)
|
|
51
|
-
@proj_name = argv.option('proj')
|
|
52
|
-
@args_dsign_flag = argv.flag?('dsign', false)
|
|
53
|
-
if @send_flag
|
|
54
|
-
@upload_flag = true
|
|
55
|
-
end
|
|
56
|
-
@args_direct_flag = argv.flag?('direct', false)
|
|
57
|
-
|
|
58
22
|
super
|
|
59
23
|
end
|
|
60
24
|
|
|
61
25
|
def run
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
# # 如果设置了 dsign 标志,则执行签名文件获取并直接返回
|
|
65
|
-
# if @args_dsign_flag
|
|
66
|
-
# Pindo::AndroidBuildHelper.share_instance.dsign(pindo_project_dir, !@args_release_flag)
|
|
67
|
-
# return
|
|
68
|
-
# end
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
app_info_obj = nil
|
|
72
|
-
workflow_info = nil
|
|
73
|
-
if @upload_flag
|
|
74
|
-
proj_name = @proj_name
|
|
75
|
-
# 传入 package_type 获取 workflow_info
|
|
76
|
-
app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
|
|
77
|
-
working_directory: Dir.pwd,
|
|
78
|
-
proj_name: proj_name,
|
|
79
|
-
package_type: 'apk'
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
# ===== 使用 workflow 配置更新 Android 项目 =====
|
|
83
|
-
if workflow_info && workflow_info[:package_name]
|
|
84
|
-
workflow_packname = workflow_info[:package_name]
|
|
85
|
-
|
|
86
|
-
puts "\n使用工作流配置更新 Android 项目:"
|
|
87
|
-
puts " Workflow Package Name: #{workflow_packname}"
|
|
88
|
-
|
|
89
|
-
# 一次性更新 App Name、Application ID 和 URL Schemes
|
|
90
|
-
Pindo::AndroidConfigHelper.update_project_with_workflow(
|
|
91
|
-
project_dir: pindo_project_dir,
|
|
92
|
-
workflow_packname: workflow_packname
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
# 添加基于 Application ID 的 Scheme(在 workflow 设置完成后)
|
|
96
|
-
Pindo::AndroidConfigHelper.add_application_id_based_scheme(
|
|
97
|
-
project_dir: pindo_project_dir
|
|
98
|
-
)
|
|
99
|
-
else
|
|
100
|
-
raise Informative, "未获取到工作流信息"
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
begin
|
|
105
|
-
apk_path = Pindo::AndroidBuildHelper.share_instance.auto_build_apk(pindo_project_dir, !@args_release_flag, @args_direct_flag)
|
|
106
|
-
ipa_file_upload = Dir.glob(apk_path).max_by {|f| File.mtime(f)}
|
|
107
|
-
|
|
108
|
-
if !ipa_file_upload.nil? && !app_info_obj.nil?
|
|
109
|
-
description = nil
|
|
110
|
-
result_data = PgyerHelper.share_instace.start_upload(
|
|
111
|
-
app_info_obj: app_info_obj,
|
|
112
|
-
ipa_file_upload: ipa_file_upload,
|
|
113
|
-
description: description,
|
|
114
|
-
workflow_info: workflow_info
|
|
115
|
-
)
|
|
116
|
-
if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
|
|
117
|
-
PgyerHelper.share_instace.print_app_version_info(
|
|
118
|
-
app_info_obj: app_info_obj,
|
|
119
|
-
app_version_info_obj: result_data["data"]
|
|
120
|
-
)
|
|
121
|
-
if @send_flag
|
|
122
|
-
# 始终发送给自己
|
|
123
|
-
PgyerHelper.share_instace.send_apptest_msg(
|
|
124
|
-
app_info_obj: app_info_obj,
|
|
125
|
-
app_version_info_obj: result_data["data"],
|
|
126
|
-
receiveType: "self"
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
# 额外发送到测试群
|
|
130
|
-
PgyerHelper.share_instace.send_apptest_msg(
|
|
131
|
-
app_info_obj: app_info_obj,
|
|
132
|
-
app_version_info_obj: result_data["data"],
|
|
133
|
-
chatEnv: "DevTest",
|
|
134
|
-
receiveType: "chat"
|
|
135
|
-
)
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# 只在构建成功完成时弹出目标文件夹
|
|
141
|
-
puts "\e[32m构建完成!正在打开目标文件夹...\e[0m"
|
|
142
|
-
system "open #{pindo_project_dir}"
|
|
143
|
-
|
|
144
|
-
rescue => e
|
|
145
|
-
puts "\e[31m构建失败: #{e.message}\e[0m"
|
|
146
|
-
puts "\e[33m正在打开项目文件夹以便检查错误...\e[0m"
|
|
147
|
-
system "open #{pindo_project_dir}"
|
|
148
|
-
raise e
|
|
149
|
-
end
|
|
150
|
-
|
|
26
|
+
# TODO: 待实现
|
|
27
|
+
raise Informative, "pindo android keystore 命令暂未实现,请使用 pindo android autobuild"
|
|
151
28
|
end
|
|
152
29
|
|
|
153
30
|
end
|
|
@@ -4,12 +4,11 @@ require 'find'
|
|
|
4
4
|
require 'fileutils'
|
|
5
5
|
require 'pindo/base/executable'
|
|
6
6
|
require 'pindo/module/build/build_helper'
|
|
7
|
-
require 'pindo/module/build/
|
|
7
|
+
require 'pindo/module/build/git_repo_helper'
|
|
8
8
|
require 'pindo/module/xcode/xcode_build_config'
|
|
9
9
|
require 'pindo/module/xcode/xcode_build_helper'
|
|
10
10
|
require 'pindo/config/ios_config_parser'
|
|
11
11
|
require 'pindo/config/build_info_manager'
|
|
12
|
-
require 'pindo/base/pindocontext'
|
|
13
12
|
require 'pindo/module/task/task_manager'
|
|
14
13
|
require 'pindo/module/task/model/unity/unity_config_task'
|
|
15
14
|
require 'pindo/module/task/model/unity/unity_update_task'
|
|
@@ -80,7 +79,8 @@ module Pindo
|
|
|
80
79
|
@option_items ||= begin
|
|
81
80
|
items = Pindo::Options::OptionGroup.merge(
|
|
82
81
|
Pindo::Options::BuildOptions.select(:bundleid),
|
|
83
|
-
Pindo::Options::JPSOptions.select(:proj, :upload, :send)
|
|
82
|
+
Pindo::Options::JPSOptions.select(:proj, :upload, :send),
|
|
83
|
+
Pindo::Options::UnityOptions.all
|
|
84
84
|
)
|
|
85
85
|
|
|
86
86
|
# 添加 increase 参数
|
|
@@ -98,12 +98,7 @@ module Pindo
|
|
|
98
98
|
|
|
99
99
|
# 命令的选项列表
|
|
100
100
|
def self.options
|
|
101
|
-
|
|
102
|
-
option_items.map { |item| item.to_claide_option }.concat([
|
|
103
|
-
['--skipconfig', '跳过Unity编译模式配置(加快构建速度)'],
|
|
104
|
-
['--skiplib', '跳过Unity必备库更新(加快构建速度)'],
|
|
105
|
-
['--skipyoo', '跳过YooAsset资源打包(加快构建速度)']
|
|
106
|
-
]).concat(super)
|
|
101
|
+
option_items.map(&:to_claide_option).concat(super)
|
|
107
102
|
end
|
|
108
103
|
|
|
109
104
|
def initialize(argv)
|
|
@@ -138,11 +133,7 @@ module Pindo
|
|
|
138
133
|
|
|
139
134
|
begin
|
|
140
135
|
# 加载 JPS 配置(如果存在)
|
|
141
|
-
|
|
142
|
-
context.load_and_apply_jps_config(pindo_project_dir)
|
|
143
|
-
|
|
144
|
-
# 注意:参数缓存已在 initialize 中通过 GlobalOptionsState 处理
|
|
145
|
-
# 不再使用 PindoContext 的缓存机制
|
|
136
|
+
Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir)
|
|
146
137
|
|
|
147
138
|
# 处理配置文件
|
|
148
139
|
prepare_config(pindo_project_dir)
|