pindo 5.12.2 → 5.13.2

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +692 -0
  3. data/lib/pindo/command/android/autobuild.rb +2 -2
  4. data/lib/pindo/command/android.rb +0 -1
  5. data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
  6. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  7. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  8. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  9. data/lib/pindo/command/appstore/cert.rb +212 -0
  10. data/lib/pindo/command/appstore/configproj.rb +81 -0
  11. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  12. data/lib/pindo/command/appstore/iap.rb +788 -24
  13. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  14. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  15. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  16. data/lib/pindo/command/appstore/pem.rb +136 -0
  17. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  18. data/lib/pindo/command/appstore/quswark.rb +87 -0
  19. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  20. data/lib/pindo/command/appstore/tag.rb +77 -0
  21. data/lib/pindo/command/appstore.rb +13 -1
  22. data/lib/pindo/command/env/quarkenv.rb +11 -13
  23. data/lib/pindo/command/env/swarkenv.rb +11 -16
  24. data/lib/pindo/command/ios/autobuild.rb +64 -43
  25. data/lib/pindo/command/ios/autoresign.rb +34 -19
  26. data/lib/pindo/command/ios/build.rb +10 -7
  27. data/lib/pindo/command/ios/cert.rb +27 -20
  28. data/lib/pindo/command/jps/upload.rb +3 -3
  29. data/lib/pindo/command/unity/autobuild.rb +2 -2
  30. data/lib/pindo/command/utils/clearcert.rb +2 -17
  31. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  32. data/lib/pindo/command/utils/renewcert.rb +62 -38
  33. data/lib/pindo/command/utils/renewproj.rb +0 -3
  34. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  35. data/lib/pindo/command/utils.rb +2 -0
  36. data/lib/pindo/command/web/autobuild.rb +2 -2
  37. data/lib/pindo/command.rb +30 -3
  38. data/lib/pindo/config/build_info_manager.rb +176 -0
  39. data/lib/pindo/config/ios_config_parser.rb +404 -0
  40. data/lib/pindo/module/android/android_build_helper.rb +110 -0
  41. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  42. data/lib/pindo/module/android/gradle_helper.rb +88 -0
  43. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  44. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  45. data/lib/pindo/module/build/build_helper.rb +12 -0
  46. data/lib/pindo/module/build/swark_helper.rb +116 -77
  47. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  48. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  49. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
  50. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  51. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  52. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  53. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  54. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  55. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  56. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  57. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  58. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
  59. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
  60. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
  61. data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
  62. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  63. data/lib/pindo/module/task/model/build_task.rb +15 -12
  64. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  65. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  66. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  67. data/lib/pindo/module/task/pindo_task.rb +19 -10
  68. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  69. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  70. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  71. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  72. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  73. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  74. data/lib/pindo/options/core/global_options_state.rb +268 -0
  75. data/lib/pindo/options/core/option_configuration.rb +206 -0
  76. data/lib/pindo/options/core/option_initializer.rb +51 -0
  77. data/lib/pindo/options/core/option_item.rb +144 -0
  78. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  79. data/lib/pindo/options/groups/build_options.rb +60 -0
  80. data/lib/pindo/options/groups/jps_options.rb +70 -0
  81. data/lib/pindo/options/groups/option_group.rb +73 -0
  82. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  83. data/lib/pindo/options/options.rb +14 -0
  84. data/lib/pindo/version.rb +1 -1
  85. metadata +49 -41
  86. data/lib/pindo/command/android/build.rb +0 -186
  87. data/lib/pindo/command/appstore/import.rb +0 -259
  88. data/lib/pindo/command/deploy/build.rb +0 -250
  89. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  90. data/lib/pindo/command/deploy/cert.rb +0 -202
  91. data/lib/pindo/command/deploy/check.rb +0 -93
  92. data/lib/pindo/command/deploy/configproj.rb +0 -120
  93. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  94. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  95. data/lib/pindo/command/deploy/iap.rb +0 -826
  96. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  97. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  98. data/lib/pindo/command/deploy/pem.rb +0 -55
  99. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  100. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  101. data/lib/pindo/command/deploy/quswark.rb +0 -156
  102. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  103. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  104. data/lib/pindo/command/deploy/resign.rb +0 -300
  105. data/lib/pindo/command/deploy/tag.rb +0 -108
  106. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  107. data/lib/pindo/command/deploy.rb +0 -42
  108. data/lib/pindo/command/dev/autobuild.rb +0 -117
  109. data/lib/pindo/command/dev/build.rb +0 -94
  110. data/lib/pindo/command/dev/debug.rb +0 -112
  111. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  112. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  113. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  114. data/lib/pindo/options/appconfigoptions.rb +0 -24
  115. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -0,0 +1,203 @@
1
+ require 'highline/import'
2
+ require 'xcodeproj'
3
+ require 'cocoapods'
4
+ require 'find'
5
+ require 'fileutils'
6
+ require 'pindo/base/executable'
7
+ require 'pindo/module/build/build_helper'
8
+ require 'pindo/module/xcode/xcode_app_config'
9
+ require 'pindo/module/xcode/xcode_build_helper'
10
+ require 'pindo/config/ios_config_parser'
11
+ require 'pindo/config/build_info_manager'
12
+ require 'pindo/module/task/task_manager'
13
+ require 'pindo/module/task/model/unity_export_task'
14
+ require 'pindo/module/task/model/build_task'
15
+ require 'pindo/options/options'
16
+
17
+ module Pindo
18
+ class Command
19
+ class Appstore < Command
20
+ class Autobuild < Appstore
21
+ include Pindo::XcodeAppConfig
22
+ include Appselect
23
+
24
+ self.summary = '编译 App Store 提交包'
25
+
26
+ self.description = <<-DESC
27
+ 编译用于提交到 App Store 的正式 IPA 包。
28
+
29
+ 支持功能:
30
+
31
+ * 自动增加版本号
32
+
33
+ * 设置 Xcode 工程编译参数
34
+
35
+ * 配置 App Store 证书
36
+
37
+ * 创建发布 Tag
38
+
39
+ * 处理 Quark/Swark 加密(如果配置)
40
+
41
+ * 处理 Applovin(如果使用)
42
+
43
+ 使用示例:
44
+
45
+ $ pindo appstore autobuild # 编译 App Store 提交包
46
+
47
+ $ pindo appstore autobuild --bundleid=com.example.app # 指定 Bundle ID
48
+ DESC
49
+
50
+ self.arguments = []
51
+
52
+ # 定义此命令使用的参数项
53
+ def self.option_items
54
+ @option_items ||= Pindo::Options::BuildOptions.select(:bundleid)
55
+ end
56
+
57
+ # 命令的选项列表
58
+ def self.options
59
+ # 转换为 CLAide 格式
60
+ option_items.map { |item| item.to_claide_option }.concat(super)
61
+ end
62
+
63
+ def initialize(argv)
64
+ # 使用 Options 模块初始化参数
65
+ @options = initialize_options(argv)
66
+
67
+ # 保存参数到实例变量
68
+ @args_bundle_id = @options[:bundleid]
69
+
70
+ super(argv)
71
+ end
72
+
73
+ def run
74
+ pindo_project_dir = Dir.pwd
75
+
76
+ begin
77
+ # 1. 克隆配置仓库(必须在 Task 外部完成)
78
+ clone_pindo_common_config_repo(force_delete: false)
79
+ clone_pindo_env_config_repo(force_delete: false)
80
+
81
+ # 2. 版本检查
82
+ Pindo::VersionCheck::check_pindo_force_upgrade()
83
+
84
+ # 3. 处理配置文件
85
+ prepare_config(pindo_project_dir)
86
+
87
+ # 4. 创建并执行任务
88
+ tasks = make_build_task(pindo_project_dir)
89
+
90
+ # 5. 添加到任务管理器并执行
91
+ task_manager = Pindo::TaskSystem::TaskManager.instance
92
+ task_manager.clear_all
93
+ tasks.each { |task| task_manager.add_task(task) }
94
+ task_manager.start
95
+
96
+ puts "Build Done !!!"
97
+ puts "#{pindo_project_dir}"
98
+ system "open #{pindo_project_dir}"
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ # 准备配置文件
105
+ def prepare_config(project_dir)
106
+ if @args_bundle_id && !@args_bundle_id.empty?
107
+ # 如果指定了 Bundle ID,拉取配置
108
+ puts "\n拉取 Bundle ID 配置: #{@args_bundle_id}"
109
+
110
+ build_info_manager = Pindo::BuildInfoManager.share_instance
111
+ success = build_info_manager.pull_appconfig_with_reponame(
112
+ repo_name: @args_bundle_id,
113
+ target_dir: project_dir
114
+ )
115
+
116
+ unless success
117
+ raise Informative, "拉取配置失败: #{@args_bundle_id}"
118
+ end
119
+
120
+ # 加载拉取的配置到 IosConfigParser
121
+ config_file = File.join(project_dir, "config.json")
122
+ if File.exist?(config_file)
123
+ puts "加载配置文件: #{config_file}"
124
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
125
+ else
126
+ raise Informative, "配置文件不存在: #{config_file}"
127
+ end
128
+ else
129
+ # 如果没有指定 Bundle ID,使用当前目录的 config.json
130
+ config_file = File.join(project_dir, "config.json")
131
+
132
+ if File.exist?(config_file)
133
+ puts "\n使用当前目录配置文件: #{config_file}"
134
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
135
+ else
136
+ raise Informative, "当前目录未找到 config.json 文件,请使用 --bundleid 参数指定 Bundle ID"
137
+ end
138
+ end
139
+ end
140
+
141
+ # 创建构建任务
142
+ def make_build_task(project_path)
143
+ # 检测项目类型
144
+ build_helper = Pindo::BuildHelper.share_instance
145
+ project_type = build_helper.project_type(project_path)
146
+
147
+ case project_type
148
+ when :android
149
+ raise Informative, "Android 工程,请使用 pindo android build"
150
+ when :ios, :unity
151
+ # 判断是否是 Unity 工程
152
+ is_unity = (project_type == :unity)
153
+
154
+ tasks = []
155
+
156
+ # 1. Unity 导出任务(仅 Unity 工程)
157
+ if is_unity
158
+ # 确定 iOS 导出路径
159
+ base_ios_path = File.join(project_path, "GoodPlatform", "BaseiOS")
160
+ ios_path = File.join(project_path, "GoodPlatform", "iOS")
161
+ ios_export_path = File.exist?(base_ios_path) ? base_ios_path : ios_path
162
+
163
+ unity_task = Pindo::TaskSystem::UnityExportTask.new(
164
+ 'ios',
165
+ project_path: project_path,
166
+ export_path: ios_export_path,
167
+ deploy_mode: 'release' # AppStore 使用 release 模式
168
+ )
169
+ tasks << unity_task
170
+ end
171
+
172
+ # 2. 构建任务
173
+ # 确定 iOS 项目路径
174
+ if is_unity
175
+ ios_project_path = ios_export_path
176
+ else
177
+ ios_project_path = project_path
178
+ end
179
+
180
+ build_options = {
181
+ project_path: ios_project_path,
182
+ enable_appstore_prepare: true # 启用 AppStore 准备工作
183
+ }
184
+ build_options[:bundle_id] = @args_bundle_id if @args_bundle_id
185
+ build_options[:unity_root_path] = project_path if is_unity
186
+
187
+ build_task = Pindo::TaskSystem::BuildTask.create_task(
188
+ platform: :ios,
189
+ mode: :release,
190
+ options: build_options
191
+ )
192
+ build_task.dependencies << tasks.last.id if tasks.any?
193
+ tasks << build_task
194
+
195
+ tasks
196
+ else
197
+ raise Informative, "当前目录不是工程目录,不能编译"
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
@@ -3,6 +3,8 @@ require 'xcodeproj'
3
3
  require 'find'
4
4
  require 'fileutils'
5
5
  require 'pindo/base/executable'
6
+ require 'pindo/config/ios_config_parser'
7
+ require 'pindo/module/xcode/ipa_resign_helper'
6
8
 
7
9
  module Pindo
8
10
  class Command
@@ -104,10 +106,12 @@ module Pindo
104
106
  end
105
107
  puts "mainapp_bundleid: #{mainapp_bundleid}"
106
108
 
107
- args_temp = []
108
- args_temp << mainapp_bundleid
109
-
110
- Pindo::Command::Deploy::Pullconfig::run(args_temp)
109
+ # 拉取应用配置
110
+ require 'pindo/config/build_info_manager'
111
+ Pindo::BuildInfoManager.share_instance.pull_appconfig_with_reponame(
112
+ repo_name: mainapp_bundleid,
113
+ target_dir: Dir.pwd
114
+ )
111
115
 
112
116
  app_info_obj = nil
113
117
  workflow_info = nil
@@ -121,23 +125,37 @@ module Pindo
121
125
  end
122
126
 
123
127
 
124
- args_temp = []
125
- if @args_dev_flag
126
- args_temp << "--dev"
127
- else
128
- args_temp << "--adhoc"
129
- end
128
+ if !ipa_file_name.nil?
129
+ # 加载配置获取 Bundle ID
130
+ config_file = File.join(Dir.pwd, "config.json")
131
+ config_parser = Pindo::IosConfigParser.instance
132
+ config_parser.load_config(config_file: config_file)
133
+ bundle_id = config_parser.bundle_id
130
134
 
135
+ if bundle_id.nil? || bundle_id.empty?
136
+ raise Informative, "无法从配置文件中获取 Bundle ID"
137
+ end
131
138
 
132
- args_temp << "--ipa=#{ipa_file_name}"
133
- Pindo::Command::Deploy::Resign::run(args_temp)
139
+ # 确定构建类型并安装证书
140
+ build_type = @args_dev_flag ? 'dev' : 'adhoc'
141
+ cert_args = build_type == 'adhoc' ? ['--build_type=adhoc'] : []
142
+ Pindo::Command::Appstore::Cert::run(cert_args)
134
143
 
135
- if !ipa_file_name.nil? && !app_info_obj.nil?
144
+ # 使用 IpaResignHelper 进行重签名
145
+ ipa_file_upload = Pindo::IpaResignHelper.resign_ipa(
146
+ ipa_file_path: ipa_file_name,
147
+ bundle_id: bundle_id
148
+ )
149
+
150
+ if ipa_file_upload.nil?
151
+ raise Informative, "重签名失败"
152
+ end
153
+
154
+ puts "\n重签名成功!"
155
+ puts "重签名后的 IPA: #{ipa_file_upload}"
156
+ end
136
157
 
137
- ipa_file_name = File::expand_path(ipa_file_name)
138
- ipa_base_name = File.basename(ipa_file_name, ".ipa")
139
- ipa_dir = File.dirname(ipa_file_name)
140
- ipa_file_upload = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
158
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
141
159
 
142
160
  if !ipa_file_upload.nil? && !app_info_obj.nil?
143
161
  description = "提交包重签名"
@@ -0,0 +1,120 @@
1
+ require 'highline/import'
2
+ require 'fileutils'
3
+ require 'json'
4
+ require 'pindo/options/options'
5
+ require 'pindo/module/appstore/bundleid_helper'
6
+
7
+ module Pindo
8
+ class Command
9
+ class Appstore < Command
10
+ class Bundleid < Appstore
11
+
12
+ # 命令的简要说明 - 在Apple开发者中心创建bundle id
13
+ self.summary = '在Apple开发者中心创建bundle id'
14
+
15
+ # 命令的详细说明,包含用法示例
16
+ self.description = <<-DESC
17
+ 根据config.json中的配置, 在Apple开发者中心创建bundle id。
18
+
19
+ 支持功能:
20
+
21
+ * 创建应用Bundle ID
22
+
23
+ * 配置应用能力(推送、App Group、iCloud等)
24
+
25
+ * 管理多个扩展的Bundle ID
26
+
27
+ * 支持位置参数(向后兼容)和选项参数两种格式
28
+
29
+ 使用示例:
30
+
31
+ $ pindo appstore bundleid # 使用当前目录的config.json
32
+
33
+ $ pindo appstore bundleid config.json # 位置参数(向后兼容)
34
+
35
+ $ pindo appstore bundleid --config=config.json # 选项参数
36
+
37
+ $ pindo appstore bundleid --sign # 启用签名标志
38
+ DESC
39
+
40
+ # 定义位置参数(向后兼容)
41
+ self.arguments = [
42
+ CLAide::Argument.new('path/to/config.json', true)
43
+ ]
44
+
45
+ # 定义此命令使用的参数项(类方法,避免重复定义)
46
+ def self.option_items
47
+ @option_items ||= [
48
+ Pindo::Options::OptionItem.new(
49
+ key: :config,
50
+ description: '指定config.json文件路径',
51
+ type: String,
52
+ optional: true,
53
+ example: 'pindo appstore bundleid --config=config.json'
54
+ ),
55
+ Pindo::Options::OptionItem.new(
56
+ key: :sign,
57
+ description: '启用签名标志',
58
+ type: TrueClass,
59
+ optional: true,
60
+ default_value: false,
61
+ example: 'pindo appstore bundleid --sign'
62
+ )
63
+ ]
64
+ end
65
+
66
+ # 命令的选项列表
67
+ def self.options
68
+ # 转换为 CLAide 格式
69
+ option_items.map { |item| item.to_claide_option }.concat(super)
70
+ end
71
+
72
+ def initialize(argv)
73
+ # 首先获取位置参数(向后兼容)
74
+ positional_config = argv.shift_argument
75
+
76
+ # 使用 Options 模块初始化参数
77
+ @options = initialize_options(argv)
78
+
79
+ # 优先使用选项参数,如果没有则使用位置参数,最后默认为当前目录的config.json
80
+ @config_path = @options[:config] || positional_config || File.join(Dir.pwd, 'config.json')
81
+ @args_sign_flag = @options[:sign]
82
+
83
+ super
84
+ @additional_args = argv.remainder!
85
+ end
86
+
87
+ def validate!
88
+ super
89
+
90
+ # 检查 config.json 文件是否存在
91
+ unless File.exist?(@config_path)
92
+ help! "配置文件不存在: #{@config_path}"
93
+ end
94
+
95
+ # 读取并解析 config.json
96
+ begin
97
+ @config_json = JSON.parse(File.read(@config_path))
98
+ rescue JSON::ParserError => e
99
+ help! "配置文件格式错误: #{e.message}"
100
+ end
101
+ end
102
+
103
+ def run
104
+ # 调用 BundleIdHelper 执行 Bundle ID 创建流程
105
+ begin
106
+ Pindo::BundleIdHelper.execute_bundleid_creation(
107
+ config_json: @config_json,
108
+ sign_flag: @args_sign_flag
109
+ )
110
+ puts "\n✓ Bundle ID 创建完成!"
111
+ rescue StandardError => e
112
+ puts "\n❌ Bundle ID 创建失败: #{e.message}"
113
+ raise e
114
+ end
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,212 @@
1
+ require 'fileutils'
2
+ require 'match'
3
+ require 'pindo/module/build/swark_helper'
4
+ require 'pindo/module/cert/xcode_cert_helper'
5
+ require 'pindo/module/cert/cert_helper'
6
+ require 'pindo/config/ios_config_parser'
7
+ require 'pindo/base/git_handler'
8
+
9
+ module Pindo
10
+ class Command
11
+ class Appstore < Command
12
+ class Cert < Appstore
13
+
14
+ self.summary = '创建证书并设置工程的证书配置'
15
+
16
+ self.description = <<-DESC
17
+ 根据 config.json 中的 bundle id 获取最新证书并配置 Xcode 工程。
18
+
19
+ 支持功能:
20
+
21
+ * 创建开发和发布证书
22
+ * 自动设置工程证书
23
+ * 更新证书配置
24
+ * 清理本地和远程证书
25
+ * 生成上传测试平台的证书
26
+
27
+ 使用示例:
28
+
29
+ $ pindo appstore cert # 创建 appstore 证书
30
+ $ pindo appstore cert --build_type=dev # 创建开发证书
31
+ $ pindo appstore cert --build_type=adhoc # 创建 adhoc 证书
32
+ $ pindo appstore cert --platform=macos # macOS 平台证书
33
+ $ pindo appstore cert --renew # 重新生成证书
34
+ $ pindo appstore cert --clean # 清理本地证书
35
+ $ pindo appstore cert --config=/path/config.json # 指定配置文件
36
+ DESC
37
+
38
+ self.arguments = [
39
+ # 无位置参数
40
+ ]
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
+ ),
51
+ Pindo::Options::OptionItem.new(
52
+ key: :build_type,
53
+ description: '构建类型 (dev/adhoc/release)',
54
+ type: String,
55
+ optional: true,
56
+ default_value: 'release'
57
+ ),
58
+ Pindo::Options::OptionItem.new(
59
+ key: :renew,
60
+ description: '重新生成证书',
61
+ type: :boolean,
62
+ optional: true,
63
+ default_value: false
64
+ ),
65
+ Pindo::Options::OptionItem.new(
66
+ key: :platform,
67
+ description: '平台类型 (ios/macos)',
68
+ type: String,
69
+ optional: true,
70
+ default_value: 'ios'
71
+ ),
72
+ Pindo::Options::OptionItem.new(
73
+ key: :clean,
74
+ description: '删除本地缓存的证书',
75
+ type: :boolean,
76
+ optional: true,
77
+ default_value: false
78
+ ),
79
+ Pindo::Options::OptionItem.new(
80
+ key: :cleangit,
81
+ description: '删除远程仓库中的证书',
82
+ type: :boolean,
83
+ optional: true,
84
+ default_value: false
85
+ ),
86
+
87
+ Pindo::Options::OptionItem.new(
88
+ key: :match,
89
+ description: '使用 match 生成证书',
90
+ type: :boolean,
91
+ optional: true,
92
+ default_value: false
93
+ ),
94
+ Pindo::Options::OptionItem.new(
95
+ key: :upload,
96
+ description: '生成上传 JPS 的证书',
97
+ type: :boolean,
98
+ optional: true,
99
+ default_value: false
100
+ )
101
+ ]
102
+ end
103
+
104
+ # 命令的选项列表
105
+ def self.options
106
+ option_items.map { |item| item.to_claide_option }.concat(super)
107
+ end
108
+
109
+ def initialize(argv)
110
+ # 使用 Options 模块初始化参数
111
+ @options = initialize_options(argv)
112
+
113
+ # 保存参数到实例变量
114
+ @config_file = @options[:config]
115
+ @build_type = @options[:build_type]
116
+ @platform_type = @options[:platform]
117
+ @clean_flag = @options[:clean]
118
+ @clean_git_flag = @options[:cleangit]
119
+ @renew_cert_flag = @options[:renew]
120
+ @match_flag = @options[:match]
121
+ @upload_flag = @options[:upload]
122
+
123
+ super
124
+ end
125
+
126
+ def run
127
+ # 标准化构建类型 (dev/adhoc/release -> development/adhoc/appstore)
128
+ @cert_type = Pindo::XcodeCertHelper.normalize_build_type(@build_type)
129
+
130
+ # 加载配置文件
131
+ config_file_path = @config_file || File.join(Dir.pwd, "config.json")
132
+ @config_parser = Pindo::IosConfigParser.instance
133
+ @config_parser.load_config(config_file: config_file_path)
134
+
135
+ # 获取配置信息
136
+ @apple_id = @config_parser.apple_id
137
+ @group_id = @config_parser.group_id
138
+ @icloud_id = @config_parser.icloud_id
139
+ # 清理本地证书
140
+ if @clean_flag
141
+ puts "清理本地证书..."
142
+ Pindo::CertHelper.clean_local_certs
143
+ end
144
+
145
+ # 清理远程 Git 证书
146
+ if @renew_cert_flag && @clean_git_flag
147
+ Pindo::CertHelper.clean_git_certs(
148
+ apple_id: @apple_id,
149
+ pindo_dir: pindo_single_config.pindo_dir,
150
+ deploy_cert_giturl: pindo_single_config.deploy_cert_giturl,
151
+ dev_cert_giturl: pindo_single_config.dev_cert_giturl,
152
+ demo_apple_id: pindo_single_config.demo_apple_id
153
+ )
154
+ end
155
+
156
+ bundle_id_array = @config_parser.get_bundle_id_array
157
+ provisioning_info_array = nil
158
+
159
+ if @renew_cert_flag || @match_flag
160
+ # 创建新证书
161
+ values = Pindo::XcodeCertHelper.get_create_cert_match_values(
162
+ apple_id: @apple_id,
163
+ bundle_id_array: bundle_id_array,
164
+ build_type: @cert_type,
165
+ platform_type: @platform_type,
166
+ renew_flag: @renew_cert_flag
167
+ )
168
+ config = FastlaneCore::Configuration.create(Match::Options.available_options, values)
169
+ Match::Runner.new.run(config)
170
+ provisioning_info_array = Pindo::XcodeCertHelper.create_provisioning_info_array(
171
+ build_type: @cert_type,
172
+ platform_type: @platform_type
173
+ )
174
+ pindo_single_config.set_cert_info(dict: provisioning_info_array)
175
+
176
+ # 获取 team_id
177
+ raise Informative, "未找到证书信息" if provisioning_info_array.nil? || provisioning_info_array.empty?
178
+ @team_id_value = provisioning_info_array.first["team_id"]
179
+ else
180
+ # 使用新封装的方法安装证书并配置 Xcode
181
+ result = Pindo::XcodeCertHelper.install_and_config_certs(
182
+ build_type: @cert_type,
183
+ platform_type: @platform_type,
184
+ project_dir: Dir.pwd
185
+ )
186
+
187
+ provisioning_info_array = result[:provisioning_info_array]
188
+ @team_id_value = result[:team_id]
189
+ end
190
+
191
+ # 生成上传测试平台的证书
192
+ if @upload_flag
193
+ Pindo::XcodeCertHelper.create_upload_cert_info(
194
+ apple_id: @apple_id,
195
+ cert_type: @cert_type,
196
+ platform_type: @platform_type
197
+ )
198
+ Pindo::XcodeCertHelper.create_upload_provisioning_info(
199
+ apple_id: @apple_id,
200
+ cert_type: @cert_type,
201
+ platform_type: @platform_type,
202
+ provisioning_info_array: provisioning_info_array
203
+ )
204
+ end
205
+
206
+ puts "✓ 证书配置完成!"
207
+ end
208
+
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,81 @@
1
+ require 'fileutils'
2
+ require 'pindo/module/xcode/xcode_build_config'
3
+ require 'pindo/config/ios_config_parser'
4
+
5
+ module Pindo
6
+ class Command
7
+ class Appstore < Command
8
+ class Configproj < Appstore
9
+
10
+ self.summary = '根据 config.json 配置 Xcode 工程参数'
11
+
12
+ self.description = <<-DESC
13
+ 根据当前目录的 config.json 配置 Xcode 工程参数。
14
+
15
+ 支持功能:
16
+
17
+ * 安装和替换 Google Plist 文件
18
+ * 创建和替换应用图标
19
+ * 替换启动页
20
+ * 修改 Bundle ID
21
+ * 设置版本号
22
+ * 配置编译选项
23
+ * 修改 Info.plist 和 AppPrefix.plist
24
+ * 检查 Swark 授权
25
+
26
+ 使用示例:
27
+
28
+ $ pindo appstore configproj # 使用当前目录的 config.json
29
+ DESC
30
+
31
+ self.arguments = [
32
+ # 无位置参数
33
+ ]
34
+
35
+ def initialize(argv)
36
+ super
37
+ end
38
+
39
+ def run
40
+ # 使用当前目录
41
+ project_dir = Dir.pwd
42
+ config_file = File.join(project_dir, "config.json")
43
+
44
+ # 检查配置文件是否存在
45
+ unless File.exist?(config_file)
46
+ raise Informative, "配置文件不存在: #{config_file}"
47
+ end
48
+
49
+ # 加载配置文件(会自动检查配置版本)
50
+ config_parser = Pindo::IosConfigParser.instance
51
+ config_parser.load_config(config_file: config_file)
52
+
53
+ # 获取 bundle_id 进行验证
54
+ bundle_id = config_parser.bundle_id
55
+ if bundle_id.nil? || bundle_id.empty?
56
+ raise Informative, "无法从配置文件中获取 Bundle ID"
57
+ end
58
+
59
+ puts "开始配置 Xcode 项目..."
60
+ puts " 项目目录: #{project_dir}"
61
+ puts " 配置文件: #{config_file}"
62
+ puts " Bundle ID: #{bundle_id}"
63
+ puts ""
64
+
65
+ # 调用封装的方法(使用已加载的 IosConfigParser 单例)
66
+ success = Pindo::XcodeBuildConfig.configure_xcode_project(
67
+ project_dir: project_dir
68
+ )
69
+
70
+ if success
71
+ puts ""
72
+ puts "✓ Xcode 项目配置完成!"
73
+ else
74
+ raise Informative, "Xcode 项目配置失败,请检查日志"
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end