pindo 5.17.4 → 5.18.3

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +120 -38
  3. data/lib/pindo/command/android/autobuild.rb +92 -31
  4. data/lib/pindo/command/appstore/adhocbuild.rb +1 -1
  5. data/lib/pindo/command/appstore/autobuild.rb +1 -1
  6. data/lib/pindo/command/appstore/autoresign.rb +1 -1
  7. data/lib/pindo/command/appstore/updateid.rb +229 -0
  8. data/lib/pindo/command/appstore.rb +1 -0
  9. data/lib/pindo/command/ios/autobuild.rb +70 -33
  10. data/lib/pindo/command/ios/podpush.rb +1 -1
  11. data/lib/pindo/command/unity/autobuild.rb +38 -18
  12. data/lib/pindo/command/utils/allcopyconfig.rb +144 -0
  13. data/lib/pindo/command/utils/copyconfig.rb +207 -0
  14. data/lib/pindo/command/utils/icon.rb +2 -2
  15. data/lib/pindo/command/utils/renewbundleid.rb +199 -0
  16. data/lib/pindo/command/utils/renewcert.rb +56 -54
  17. data/lib/pindo/command/utils.rb +3 -0
  18. data/lib/pindo/command/web/autobuild.rb +10 -8
  19. data/lib/pindo/config/build_info_manager.rb +1 -3
  20. data/lib/pindo/module/android/android_build_helper.rb +198 -33
  21. data/lib/pindo/module/android/android_config_helper.rb +305 -88
  22. data/lib/pindo/module/android/android_project_helper.rb +124 -14
  23. data/lib/pindo/module/android/android_res_helper.rb +349 -51
  24. data/lib/pindo/module/android/keystore_helper.rb +611 -295
  25. data/lib/pindo/module/android/workflow_gradle_injector.rb +702 -0
  26. data/lib/pindo/module/appselect.rb +4 -4
  27. data/lib/pindo/module/appstore/bundleid_helper.rb +204 -14
  28. data/lib/pindo/module/build/build_helper.rb +76 -10
  29. data/lib/pindo/module/build/git_repo_helper.rb +4 -4
  30. data/lib/pindo/module/cert/mode/base_cert_operator.rb +12 -6
  31. data/lib/pindo/module/pgyer/pgyerhelper.rb +124 -39
  32. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +64 -6
  33. data/lib/pindo/module/task/model/git/git_commit_task.rb +70 -54
  34. data/lib/pindo/module/task/model/git/git_tag_task.rb +13 -9
  35. data/lib/pindo/module/task/model/jps/jps_upload_task.rb +110 -3
  36. data/lib/pindo/module/task/model/unity/unity_export_task.rb +2 -1
  37. data/lib/pindo/module/task/model/unity/unity_update_task.rb +2 -1
  38. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +2 -1
  39. data/lib/pindo/module/task/model/unity_task.rb +2 -1
  40. data/lib/pindo/module/unity/unity_helper.rb +13 -10
  41. data/lib/pindo/module/unity/unity_proc_helper.rb +27 -2
  42. data/lib/pindo/module/xcode/applovin_xcode_helper.rb +6 -2
  43. data/lib/pindo/module/xcode/res/xcode_res_constant.rb +72 -0
  44. data/lib/pindo/module/xcode/res/xcode_res_handler.rb +3 -3
  45. data/lib/pindo/module/xcode/xcode_build_config.rb +46 -17
  46. data/lib/pindo/module/xcode/xcode_build_helper.rb +186 -25
  47. data/lib/pindo/module/xcode/xcode_project_helper.rb +1 -1
  48. data/lib/pindo/module/xcode/xcode_res_helper.rb +32 -16
  49. data/lib/pindo/options/groups/build_options.rb +5 -5
  50. data/lib/pindo/options/groups/git_options.rb +7 -5
  51. data/lib/pindo/options/groups/unity_options.rb +11 -0
  52. data/lib/pindo/options/helpers/bundleid_selector.rb +25 -0
  53. data/lib/pindo/options/helpers/git_constants.rb +7 -6
  54. data/lib/pindo/version.rb +3 -3
  55. metadata +12 -7
@@ -0,0 +1,229 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'spaceship'
4
+ require 'pindo/options/options'
5
+ require 'pindo/module/appstore/bundleid_helper'
6
+ require 'pindo/base/git_handler'
7
+ require 'pindo/config/build_info_manager'
8
+
9
+ module Pindo
10
+ class Command
11
+ class Appstore < Command
12
+ class Updateid < Appstore
13
+
14
+ self.summary = '从Apple开发者中心同步bundle id的capabilities到config.json'
15
+
16
+ self.description = <<-DESC
17
+ 从Apple Developer Portal读取当前项目Bundle ID的Capability状态,
18
+ 写入config.json的capabilities字段并提交到Git仓库。
19
+
20
+ 支持功能:
21
+
22
+ * 读取主Bundle ID和所有Extension的Capability状态
23
+
24
+ * 自动识别App Group、iCloud容器的关联ID
25
+
26
+ * 将capabilities写入config.json并提交到Git仓库
27
+
28
+ * 支持dry-run预览模式
29
+
30
+ 使用示例:
31
+
32
+ $ pindo appstore updateid # 使用当前目录的config.json
33
+
34
+ $ pindo appstore updateid --config=config.json # 指定config.json路径
35
+
36
+ $ pindo appstore updateid --dry-run # 预览模式,不修改文件
37
+ DESC
38
+
39
+ self.arguments = [
40
+ CLAide::Argument.new('path/to/config.json', true)
41
+ ]
42
+
43
+ def self.option_items
44
+ @option_items ||= [
45
+ Pindo::Options::OptionItem.new(
46
+ key: :config,
47
+ description: '指定config.json文件路径',
48
+ type: String,
49
+ optional: true,
50
+ example: 'pindo appstore updateid --config=config.json'
51
+ ),
52
+ Pindo::Options::OptionItem.new(
53
+ key: :dry_run,
54
+ description: '预览模式,只显示差异不修改文件',
55
+ type: :boolean,
56
+ optional: true,
57
+ default_value: false,
58
+ example: 'pindo appstore updateid --dry-run'
59
+ )
60
+ ]
61
+ end
62
+
63
+ def self.options
64
+ option_items.map { |item| item.to_claide_option }.concat(super)
65
+ end
66
+
67
+ def initialize(argv)
68
+ positional_config = argv.shift_argument
69
+ @options = initialize_options(argv)
70
+ @config_path = @options[:config] || positional_config || File.join(Dir.pwd, 'config.json')
71
+ @dry_run = @options[:dry_run]
72
+ super
73
+ @additional_args = argv.remainder!
74
+ end
75
+
76
+ def validate!
77
+ super
78
+ unless File.exist?(@config_path)
79
+ help! "配置文件不存在: #{@config_path}"
80
+ end
81
+ begin
82
+ @config_json = JSON.parse(File.read(@config_path))
83
+ rescue JSON::ParserError => e
84
+ help! "配置文件格式错误: #{e.message}"
85
+ end
86
+
87
+ # 验证 app_identifier
88
+ app_info = @config_json['app_info']
89
+ if app_info.nil? || app_info['app_identifier'].nil? || app_info['app_identifier'].empty?
90
+ help! "config.json 中缺少 app_info.app_identifier"
91
+ end
92
+
93
+ # 验证 Apple ID
94
+ apple_id = @config_json.dig('account_info', 'apple_acount_id')
95
+ if apple_id.nil? || apple_id.empty? || apple_id.include?("__________")
96
+ help! "config.json 中缺少有效的 Apple ID (account_info.apple_acount_id)"
97
+ end
98
+ end
99
+
100
+ def run
101
+ begin
102
+ app_info = @config_json['app_info']
103
+ apple_id = @config_json.dig('account_info', 'apple_acount_id')
104
+
105
+ # 登录 Apple Developer Portal
106
+ puts "Login #{apple_id}..."
107
+ Spaceship.login(apple_id.to_s)
108
+ Spaceship.select_team
109
+
110
+ bundle_id = app_info['app_identifier']
111
+ puts
112
+ puts "读取 #{bundle_id} 的 Capability..."
113
+
114
+ # 读取主 Bundle ID 的 capabilities
115
+ capabilities = Pindo::BundleIdHelper.fetch_capabilities_from_portal(bundle_id: bundle_id)
116
+
117
+ if capabilities.nil?
118
+ puts "无法读取 #{bundle_id} 的 Capability,跳过"
119
+ return
120
+ end
121
+
122
+ # 显示读取到的 capabilities
123
+ capabilities.each do |key, value|
124
+ puts " #{key}: #{value.is_a?(String) ? "\"#{value}\"" : value}"
125
+ end
126
+
127
+ # 更新所有 Extension Bundle ID 的名称
128
+ puts
129
+ extension_keys = app_info.keys.select { |k| k.start_with?("app_identifier_") }
130
+ extension_keys.each do |key|
131
+ ext_bundle_id = app_info[key]
132
+ next if ext_bundle_id.nil? || ext_bundle_id.empty? || ext_bundle_id.include?("__________")
133
+
134
+ expected_name = Pindo::BundleIdHelper.generate_bundleid_name(ext_bundle_id)
135
+ ext_app = Spaceship::Portal.app.find(ext_bundle_id)
136
+ if ext_app.nil?
137
+ puts " #{ext_bundle_id} — Portal 中未找到,跳过"
138
+ next
139
+ end
140
+
141
+ if ext_app.name != expected_name
142
+ puts "Update #{ext_bundle_id} name: #{ext_app.name} -> #{expected_name}"
143
+ begin
144
+ ext_app.update_name!(expected_name)
145
+ rescue => e
146
+ puts " Portal 更新名称失败: #{e.message},尝试通过 API Key 更新..."
147
+ begin
148
+ Pindo::BundleIdHelper.update_bundleid_name(bundle_id: ext_bundle_id, new_name: expected_name)
149
+ rescue => e2
150
+ puts " 更新名称失败: #{e2.message}"
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ if @dry_run
157
+ # dry-run 模式:对比现有 capabilities 并显示差异
158
+ old_capabilities = app_info['capabilities'] || {}
159
+ puts
160
+ puts "[dry-run] 差异:"
161
+ has_diff = false
162
+ capabilities.each do |key, new_value|
163
+ old_value = old_capabilities[key]
164
+ if old_value.nil?
165
+ puts " + #{key}: #{new_value.is_a?(String) ? "\"#{new_value}\"" : new_value}"
166
+ has_diff = true
167
+ elsif old_value != new_value
168
+ old_display = old_value.is_a?(String) ? "\"#{old_value}\"" : old_value
169
+ new_display = new_value.is_a?(String) ? "\"#{new_value}\"" : new_value
170
+ puts " ~ #{key}: #{old_display} -> #{new_display}"
171
+ has_diff = true
172
+ end
173
+ end
174
+ old_capabilities.each do |key, old_value|
175
+ unless capabilities.key?(key)
176
+ old_display = old_value.is_a?(String) ? "\"#{old_value}\"" : old_value
177
+ puts " = #{key}: #{old_display} (保留)"
178
+ has_diff = true
179
+ end
180
+ end
181
+ puts " (无差异)" unless has_diff
182
+ puts
183
+ puts "[dry-run] 未修改任何文件"
184
+ else
185
+ # 获取 config 仓库目录并更新到最新(~/.pindo/{bundle_id}/)
186
+ app_config_dir = Pindo::GitHandler.clong_buildconfig_repo(repo_name: bundle_id)
187
+ config_repo_file = File.join(app_config_dir, "config.json")
188
+
189
+ # 提交前先丢弃仓库中未跟踪的修改,确保干净状态
190
+ Pindo::GitHandler.git!(%W(-C #{app_config_dir} checkout -- config.json)) rescue nil
191
+
192
+ # 读取仓库中最新的 config.json 并更新 capabilities
193
+ repo_config_json = JSON.parse(File.read(config_repo_file))
194
+ repo_config_json['app_info']['capabilities'] = (repo_config_json['app_info']['capabilities'] || {}).merge(capabilities)
195
+
196
+ # 只写入 config.json 一个文件
197
+ File.open(config_repo_file, "w") do |f|
198
+ f.write(JSON.pretty_generate(repo_config_json) + "\n")
199
+ end
200
+
201
+ # 同时更新本地 config.json(如果路径不同)
202
+ if File.expand_path(@config_path) != File.expand_path(config_repo_file)
203
+ @config_json['app_info']['capabilities'] = (app_info['capabilities'] || {}).merge(capabilities)
204
+ File.open(@config_path, "w") do |f|
205
+ f.write(JSON.pretty_generate(@config_json) + "\n")
206
+ end
207
+ end
208
+
209
+ puts
210
+
211
+ # 只提交 config.json 到 Git 仓库
212
+ Pindo::GitHandler.git_addpush_repo(
213
+ path: app_config_dir,
214
+ message: "sync capabilities from Apple Developer Portal",
215
+ commit_file_params: ["config.json"]
216
+ )
217
+
218
+ puts "capabilities 已写入 config.json 并提交"
219
+ end
220
+ rescue StandardError => e
221
+ puts "\n updateid 失败: #{e.message}"
222
+ raise e
223
+ end
224
+ end
225
+
226
+ end
227
+ end
228
+ end
229
+ end
@@ -20,6 +20,7 @@ require 'pindo/command/appstore/configproj'
20
20
  require 'pindo/command/appstore/quswark'
21
21
  require 'pindo/command/appstore/quswauth'
22
22
  require 'pindo/command/appstore/tag'
23
+ require 'pindo/command/appstore/updateid'
23
24
 
24
25
  module Pindo
25
26
  class Command
@@ -158,27 +158,18 @@ module Pindo
158
158
 
159
159
  def validate!
160
160
  super # 基类的 HelpValidator 会统一处理 --help
161
-
162
- # 如果没有指定 bundleid,进行交互式选择
163
- if @args_bundle_id.nil? || @args_bundle_id.empty?
164
- @args_bundle_id = Pindo::Options::BundleIdSelector.select_bundleid(@build_type)
165
-
166
- # 如果用户取消选择或选择失败,报错
167
- if @args_bundle_id.nil? || @args_bundle_id.empty?
168
- help! "未选择有效的 Bundle ID"
169
- end
170
-
171
- # 重要:将交互式选择的值同步回 @options,确保能被缓存系统保存
172
- @options[:bundleid] = @args_bundle_id
173
- end
161
+ # bundle_id 校验推迟到 run 中,在 load_jps_build_config 之后解析
174
162
  end
175
163
 
176
164
  def run
177
165
  pindo_project_dir = Dir.pwd
178
166
 
179
167
  begin
180
- # 加载 JPS 配置(如果存在)
181
- Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir)
168
+ # 加载 JPS 配置(缓存 project_name,并通过映射表解析 bundle_id)
169
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
170
+
171
+ # 解析 bundle_id(优先级:命令行参数 > JPSBuildConfig映射 > 交互选择)
172
+ resolve_bundle_id!
182
173
 
183
174
  # 准备配置
184
175
  config = prepare_ios_config(pindo_project_dir)
@@ -207,6 +198,44 @@ module Pindo
207
198
 
208
199
  private
209
200
 
201
+ # 解析 bundle_id(优先级:命令行参数 > JPSBuildConfig映射 > prepare_upload交互选择)
202
+ def resolve_bundle_id!
203
+ # 优先级 1:命令行 --bundleid 参数
204
+ return if @args_bundle_id && !@args_bundle_id.empty?
205
+
206
+ # 优先级 2:JPSBuildConfig.json 通过映射表解析的 bundle_id
207
+ resolved = Pindo::Options::GlobalOptionsState.instance[:bundleid]
208
+ if resolved && !resolved.empty?
209
+ @args_bundle_id = resolved
210
+ return
211
+ end
212
+
213
+ # 优先级 3:走 prepare_upload 交互选择 JPS 项目,创建/更新 JPSBuildConfig.json
214
+ pindo_project_dir = Dir.pwd
215
+ is_macos = Pindo::BuildHelper.share_instance.macos_project?(pindo_project_dir)
216
+ package_type = is_macos ? 'mac' : 'ipa'
217
+
218
+ @cached_app_info_obj, @cached_workflow_info = PgyerHelper.share_instace.prepare_upload(
219
+ working_directory: pindo_project_dir,
220
+ conf: @args_conf,
221
+ package_type: package_type
222
+ )
223
+
224
+ # prepare_upload 已创建 JPSBuildConfig.json,重新加载获取 bundle_id
225
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
226
+ resolved = Pindo::Options::GlobalOptionsState.instance[:bundleid]
227
+ if resolved && !resolved.empty?
228
+ @args_bundle_id = resolved
229
+ return
230
+ end
231
+
232
+ # 最终降级:交互选择 bundle_id
233
+ @args_bundle_id = Pindo::Options::BundleIdSelector.select_bundleid(@build_type)
234
+ if @args_bundle_id.nil? || @args_bundle_id.empty?
235
+ raise Informative, "未选择有效的 Bundle ID"
236
+ end
237
+ end
238
+
210
239
  # 创建构建任务
211
240
  def make_build_task(config)
212
241
  # 检测项目类型
@@ -316,12 +345,15 @@ module Pindo
316
345
  build_task.dependencies << tasks.last.id if tasks.any?
317
346
  tasks << build_task
318
347
 
319
- # 4. Git 标签任务(依赖第一个编译任务)
320
- # 所有参数都从 GitCommitTask 获取
321
- git_tag_task = Pindo::TaskSystem::GitTagTask.new(config[:project_path])
322
- git_tag_task.dependencies << build_task.id
323
- git_tag_task.dependencies << git_commit_task.id
324
- tasks << git_tag_task
348
+ # 4. Git 标签任务(skip_without_tag 模式下不创建)
349
+ git_tag_task = nil
350
+ unless process_type == Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG
351
+ # 所有参数都从 GitCommitTask 获取
352
+ git_tag_task = Pindo::TaskSystem::GitTagTask.new(config[:project_path])
353
+ git_tag_task.dependencies << build_task.id
354
+ git_tag_task.dependencies << git_commit_task.id
355
+ tasks << git_tag_task
356
+ end
325
357
 
326
358
  # 5. 上传和消息发送任务(如果需要)
327
359
  upload_task = nil # 声明变量以便后续绑定任务使用
@@ -421,7 +453,7 @@ module Pindo
421
453
  )
422
454
  # 依赖 Git Commit、Git Tag 和 Bind Package 任务
423
455
  workflow_message_task.dependencies << git_commit_task.id
424
- workflow_message_task.dependencies << git_tag_task.id
456
+ workflow_message_task.dependencies << git_tag_task.id if git_tag_task
425
457
  workflow_message_task.dependencies << bind_package_task.id
426
458
  tasks << workflow_message_task
427
459
  end
@@ -440,17 +472,22 @@ module Pindo
440
472
  # 拉取并加载配置文件到 IosConfigParser
441
473
  load_config_file(pindo_project_dir, bundle_id)
442
474
 
443
- # 获取 JPS 配置
444
- # 根据 Xcode 工程类型动态设置 package_type
445
- # JPSUploadTask 支持的文件类型:'ipa' | 'apk' | 'html' | 'mac'
446
- is_macos = Pindo::BuildHelper.share_instance.macos_project?(pindo_project_dir)
447
- package_type = is_macos ? 'mac' : 'ipa'
448
-
449
- app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
450
- working_directory: pindo_project_dir,
451
- conf: @args_conf,
452
- package_type: package_type
453
- )
475
+ # 获取 JPS 配置(复用 resolve_bundle_id! 中已缓存的结果)
476
+ if @cached_app_info_obj && @cached_workflow_info
477
+ app_info_obj = @cached_app_info_obj
478
+ workflow_info = @cached_workflow_info
479
+ else
480
+ # 根据 Xcode 工程类型动态设置 package_type
481
+ # JPSUploadTask 支持的文件类型:'ipa' | 'apk' | 'html' | 'mac'
482
+ is_macos = Pindo::BuildHelper.share_instance.macos_project?(pindo_project_dir)
483
+ package_type = is_macos ? 'mac' : 'ipa'
484
+
485
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
486
+ working_directory: pindo_project_dir,
487
+ conf: @args_conf,
488
+ package_type: package_type
489
+ )
490
+ end
454
491
 
455
492
  {
456
493
  project_path: pindo_project_dir,
@@ -193,7 +193,7 @@ module Pindo
193
193
  git!(%W(-C #{private_source.repo} reset --hard))
194
194
  git!(%W(-C #{private_source.repo} clean -dfx))
195
195
  git!(%W(-C #{private_source.repo} branch --set-upstream-to=origin/#{private_source_branch} #{private_source_branch}))
196
- git!(%W(-C #{private_source.repo} pull))
196
+ Pindo::GitHandler.git_remote!(private_source.repo, %W(-C #{private_source.repo} pull))
197
197
  rescue StandardError => e
198
198
  raise Informative, "私有Pod索引目录异常,请删除#{private_source.repo}重新新下载"
199
199
  end
@@ -74,7 +74,7 @@ module Pindo
74
74
 
75
75
  $ pindo unity autobuild --bundleid=com.example.app # 指定 Bundle ID (iOS)
76
76
 
77
- $ pindo unity autobuild --bundle_name=com.example.app # 指定 Bundle Name (Android)
77
+ $ pindo unity autobuild --bundle_name=com.example.* # 指定 Bundle Name (Android,支持通配符)
78
78
 
79
79
  $ pindo unity autobuild --proj="My App" # 指定项目名称
80
80
 
@@ -89,6 +89,8 @@ module Pindo
89
89
  $ pindo unity autobuild --send # 编译、打tag、上传、发上传消息、上传媒体附件、绑定包到工作流 + 发送群消息
90
90
 
91
91
  $ pindo unity autobuild --multi # 使用并发模式执行
92
+
93
+ $ pindo unity autobuild --kill-unity # 自动关闭 Unity 进程(不询问确认)
92
94
  DESC
93
95
 
94
96
  # 命令参数
@@ -101,7 +103,7 @@ module Pindo
101
103
  @option_items ||= Pindo::Options::OptionGroup.merge(
102
104
  Pindo::Options::BuildOptions.select(:bundleid, :bundle_name), # 添加 bundleid 和 bundle_name 参数
103
105
  Pindo::Options::JPSOptions.select(:conf, :upload, :send, :media, :bind),
104
- Pindo::Options::UnityOptions.select(:skiplib, :skipyoo),
106
+ Pindo::Options::UnityOptions.select(:skiplib, :skipyoo, :kill_unity),
105
107
  Pindo::Options::UnityOptions.select_with_defaults(skipconfig: true),
106
108
  Pindo::Options::TaskOptions.select(:multi),
107
109
  Pindo::Options::GitOptions.all
@@ -144,6 +146,7 @@ module Pindo
144
146
  # Unity 参数
145
147
  @args_skip_lib = @options[:skiplib] || false
146
148
  @args_skip_yoo = @options[:skipyoo] || false
149
+ @args_kill_unity = @options[:kill_unity] || false
147
150
 
148
151
  # Task 参数
149
152
  @args_multi_flag = @options[:multi] || false
@@ -198,6 +201,9 @@ module Pindo
198
201
  raise Informative, "当前目录不是Unity工程,请在Unity工程根目录下执行此命令"
199
202
  end
200
203
 
204
+ # 加载 JPS 配置(缓存 project_name,并通过映射表解析 bundle_id)
205
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
206
+
201
207
  # 1. 获取要构建的类型列表
202
208
  selected_platforms = get_selected_build_types()
203
209
 
@@ -264,9 +270,9 @@ module Pindo
264
270
  # 判断是否只有 web 平台(web 平台需要在导出前创建 Tag)
265
271
  only_web_platform = selected_platforms == ['web']
266
272
 
267
- # 如果只有 web 平台,在 Unity 导出之前创建 Git 标签任务
268
- # 所有参数都从 GitCommitTask 获取
269
- if only_web_platform
273
+ # 如果只有 web 平台,在 Unity 导出之前创建 Git 标签任务(skip_without_tag 模式下不创建)
274
+ git_tag_task = nil
275
+ if only_web_platform && process_type != Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG
270
276
  git_tag_task = Pindo::TaskSystem::GitTagTask.new(Dir.pwd)
271
277
  git_tag_task.dependencies << git_commit_task.id
272
278
  all_tasks << git_tag_task
@@ -276,7 +282,8 @@ module Pindo
276
282
  # 第一步:创建 Unity 更新任务(所有平台共享,可选)
277
283
  unless @args_skip_lib
278
284
  unity_update_task = Pindo::TaskSystem::UnityUpdateTask.new(
279
- project_path: Dir.pwd
285
+ project_path: Dir.pwd,
286
+ auto_kill: @args_kill_unity
280
287
  )
281
288
  unity_update_task.dependencies << common_dependency_task.id
282
289
  all_tasks << unity_update_task
@@ -297,7 +304,8 @@ module Pindo
297
304
  unless @args_skip_yoo
298
305
  unity_yoo_task = Pindo::TaskSystem::UnityYooAssetTask.new(
299
306
  platform,
300
- project_path: Dir.pwd
307
+ project_path: Dir.pwd,
308
+ auto_kill: @args_kill_unity
301
309
  )
302
310
  unity_yoo_task.dependencies << platform_dependency_task.id
303
311
  all_tasks << unity_yoo_task
@@ -316,10 +324,9 @@ module Pindo
316
324
  platform_build_tasks[platform] = build_task
317
325
  end
318
326
 
319
- # 第三步:创建 Git 标签任务(依赖第一个平台的构建任务)
327
+ # 第三步:创建 Git 标签任务(skip_without_tag 模式下不创建)
320
328
  # 注意:如果只有 web 平台,GitTagTask 已在前面创建,这里跳过
321
- # 所有参数都从 GitCommitTask 获取
322
- unless only_web_platform
329
+ unless only_web_platform || process_type == Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG
323
330
  first_build_task = platform_build_tasks[selected_platforms.first]
324
331
  if first_build_task
325
332
  git_tag_task = Pindo::TaskSystem::GitTagTask.new(Dir.pwd)
@@ -411,7 +418,7 @@ module Pindo
411
418
  )
412
419
  # 依赖 Git Commit、Git Tag 和 Bind Package 任务
413
420
  workflow_message_task.dependencies << git_commit_task.id
414
- workflow_message_task.dependencies << git_tag_task.id
421
+ workflow_message_task.dependencies << git_tag_task.id if git_tag_task
415
422
  workflow_message_task.dependencies << bind_package_task.id
416
423
  all_tasks << workflow_message_task
417
424
  end
@@ -460,7 +467,8 @@ module Pindo
460
467
  platform,
461
468
  project_path: Dir.pwd,
462
469
  export_path: export_path,
463
- context: context
470
+ context: context,
471
+ auto_kill: @args_kill_unity
464
472
  )
465
473
  end
466
474
 
@@ -584,6 +592,10 @@ module Pindo
584
592
  package_type: package_type
585
593
  )
586
594
 
595
+ # prepare_upload 可能会创建/更新 JPSBuildConfig.json(尤其是首次执行)
596
+ # 这里需要重新加载一次,以便通过映射表解析出 bundleid/bundle_name
597
+ Pindo::BuildHelper.share_instance.load_jps_build_config(Dir.pwd)
598
+
587
599
  # 保存 app_info_obj 到共享配置(所有平台共享同一个项目)
588
600
  if configs["app_info_obj"].nil?
589
601
  configs["app_info_obj"] = app_info_obj
@@ -599,11 +611,14 @@ module Pindo
599
611
 
600
612
  case platform
601
613
  when 'ios'
602
- # 获取 iOS Bundle ID
603
- if @args_bundle_id
614
+ # 获取 iOS Bundle ID(优先级:命令行 > JPSBuildConfig映射 > 交互选择)
615
+ if @args_bundle_id && !@args_bundle_id.empty?
604
616
  platform_config["bundle_id"] = @args_bundle_id
605
617
  else
606
- if @args_deploy_flag
618
+ cached = Pindo::Options::GlobalOptionsState.instance[:bundleid]
619
+ if cached && !cached.empty?
620
+ platform_config["bundle_id"] = cached
621
+ elsif @args_deploy_flag
607
622
  platform_config["bundle_id"] = get_selected_deploy_bundleid()
608
623
  else
609
624
  platform_config["bundle_id"] = get_selected_dev_bundleid()
@@ -615,11 +630,16 @@ module Pindo
615
630
  prepare_ios_config(platform_config["bundle_id"])
616
631
 
617
632
  when 'android'
618
- # 获取 Android Package Name
619
- if @args_bundle_name
633
+ # 获取 Android Package Name(优先级:命令行 > JPSBuildConfig映射 > 交互选择)
634
+ if @args_bundle_name && !@args_bundle_name.empty?
620
635
  platform_config["bundle_name"] = @args_bundle_name
621
636
  else
622
- platform_config["bundle_name"] = get_selected_dev_bundle_name()
637
+ cached = Pindo::Options::GlobalOptionsState.instance[:bundle_name]
638
+ if cached && !cached.empty?
639
+ platform_config["bundle_name"] = cached
640
+ else
641
+ platform_config["bundle_name"] = get_selected_dev_bundle_name()
642
+ end
623
643
  end
624
644
  puts " Package Name: #{platform_config["bundle_name"]}"
625
645