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.
- checksums.yaml +4 -4
- data/lib/pindo/base/git_handler.rb +692 -0
- data/lib/pindo/command/android/autobuild.rb +2 -2
- data/lib/pindo/command/android.rb +0 -1
- data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
- data/lib/pindo/command/appstore/autobuild.rb +203 -0
- data/lib/pindo/command/appstore/autoresign.rb +35 -17
- data/lib/pindo/command/appstore/bundleid.rb +120 -0
- data/lib/pindo/command/appstore/cert.rb +212 -0
- data/lib/pindo/command/appstore/configproj.rb +81 -0
- data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
- data/lib/pindo/command/appstore/iap.rb +788 -24
- data/lib/pindo/command/appstore/initconfig.rb +105 -0
- data/lib/pindo/command/appstore/itcapp.rb +95 -13
- data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
- data/lib/pindo/command/appstore/pem.rb +136 -0
- data/lib/pindo/command/appstore/pullconfig.rb +99 -0
- data/lib/pindo/command/appstore/quswark.rb +87 -0
- data/lib/pindo/command/appstore/quswauth.rb +67 -0
- data/lib/pindo/command/appstore/tag.rb +77 -0
- data/lib/pindo/command/appstore.rb +13 -1
- data/lib/pindo/command/env/quarkenv.rb +11 -13
- data/lib/pindo/command/env/swarkenv.rb +11 -16
- data/lib/pindo/command/ios/autobuild.rb +64 -43
- data/lib/pindo/command/ios/autoresign.rb +34 -19
- data/lib/pindo/command/ios/build.rb +10 -7
- data/lib/pindo/command/ios/cert.rb +27 -20
- data/lib/pindo/command/jps/upload.rb +3 -3
- data/lib/pindo/command/unity/autobuild.rb +2 -2
- data/lib/pindo/command/utils/clearcert.rb +2 -17
- data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
- data/lib/pindo/command/utils/renewcert.rb +62 -38
- data/lib/pindo/command/utils/renewproj.rb +0 -3
- data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
- data/lib/pindo/command/utils.rb +2 -0
- data/lib/pindo/command/web/autobuild.rb +2 -2
- data/lib/pindo/command.rb +30 -3
- data/lib/pindo/config/build_info_manager.rb +176 -0
- data/lib/pindo/config/ios_config_parser.rb +404 -0
- data/lib/pindo/module/android/android_build_helper.rb +110 -0
- data/lib/pindo/module/android/android_config_helper.rb +9 -5
- data/lib/pindo/module/android/gradle_helper.rb +88 -0
- data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
- data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
- data/lib/pindo/module/build/build_helper.rb +12 -0
- data/lib/pindo/module/build/swark_helper.rb +116 -77
- data/lib/pindo/module/cert/cert_helper.rb +74 -0
- data/lib/pindo/module/cert/pem_helper.rb +72 -0
- data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
- data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
- data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
- data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
- data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
- data/lib/pindo/module/task/model/build_task.rb +15 -12
- data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
- data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
- data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
- data/lib/pindo/module/task/pindo_task.rb +19 -10
- data/lib/pindo/module/unity/unity_helper.rb +2 -1
- data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
- data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
- data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
- data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
- data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
- data/lib/pindo/options/core/global_options_state.rb +268 -0
- data/lib/pindo/options/core/option_configuration.rb +206 -0
- data/lib/pindo/options/core/option_initializer.rb +51 -0
- data/lib/pindo/options/core/option_item.rb +144 -0
- data/lib/pindo/options/core/option_value_parser.rb +54 -0
- data/lib/pindo/options/groups/build_options.rb +60 -0
- data/lib/pindo/options/groups/jps_options.rb +70 -0
- data/lib/pindo/options/groups/option_group.rb +73 -0
- data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
- data/lib/pindo/options/options.rb +14 -0
- data/lib/pindo/version.rb +1 -1
- metadata +49 -41
- data/lib/pindo/command/android/build.rb +0 -186
- data/lib/pindo/command/appstore/import.rb +0 -259
- data/lib/pindo/command/deploy/build.rb +0 -250
- data/lib/pindo/command/deploy/bundleid.rb +0 -259
- data/lib/pindo/command/deploy/cert.rb +0 -202
- data/lib/pindo/command/deploy/check.rb +0 -93
- data/lib/pindo/command/deploy/configproj.rb +0 -120
- data/lib/pindo/command/deploy/confusecode.rb +0 -262
- data/lib/pindo/command/deploy/confuseproj.rb +0 -122
- data/lib/pindo/command/deploy/iap.rb +0 -826
- data/lib/pindo/command/deploy/initconfig.rb +0 -138
- data/lib/pindo/command/deploy/itcapp.rb +0 -146
- data/lib/pindo/command/deploy/pem.rb +0 -55
- data/lib/pindo/command/deploy/pullconfig.rb +0 -56
- data/lib/pindo/command/deploy/pushconfig.rb +0 -93
- data/lib/pindo/command/deploy/quswark.rb +0 -156
- data/lib/pindo/command/deploy/quswauth.rb +0 -76
- data/lib/pindo/command/deploy/reportbug.rb +0 -145
- data/lib/pindo/command/deploy/resign.rb +0 -300
- data/lib/pindo/command/deploy/tag.rb +0 -108
- data/lib/pindo/command/deploy/uploadipa.rb +0 -73
- data/lib/pindo/command/deploy.rb +0 -42
- data/lib/pindo/command/dev/autobuild.rb +0 -117
- data/lib/pindo/command/dev/build.rb +0 -94
- data/lib/pindo/command/dev/debug.rb +0 -112
- data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
- data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
- data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
- data/lib/pindo/options/appconfigoptions.rb +0 -24
- 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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|