pindo 5.13.1 → 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/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 +9 -6
- 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_config_helper.rb +9 -5
- 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/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 -40
- 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,367 @@
|
|
|
1
|
+
require_relative 'ios_build_task'
|
|
2
|
+
require 'pindo/module/build/build_helper'
|
|
3
|
+
require 'pindo/module/build/version_helper'
|
|
4
|
+
require 'pindo/module/build/git_repo_helper'
|
|
5
|
+
require 'pindo/module/xcode/xcode_build_config'
|
|
6
|
+
require 'pindo/module/xcode/xcode_build_helper'
|
|
7
|
+
require 'pindo/module/xcode/xcode_app_config'
|
|
8
|
+
require 'pindo/module/pgyer/pgyerhelper'
|
|
9
|
+
require 'pindo/config/ios_config_parser'
|
|
10
|
+
|
|
11
|
+
module Pindo
|
|
12
|
+
module TaskSystem
|
|
13
|
+
# iOS AppStore 模式构建任务
|
|
14
|
+
# 使用 Distribution/App Store 证书编译 iOS 工程
|
|
15
|
+
# 包含 AppStore 特有的准备工作(版本号增加、Tag 创建、Quark/Swark 处理等)
|
|
16
|
+
class IosBuildAppStoreTask < IosBuildTask
|
|
17
|
+
def initialize(options = {})
|
|
18
|
+
@bundle_id = options[:bundle_id]
|
|
19
|
+
@proj_name = options[:proj_name]
|
|
20
|
+
@upload_flag = options[:upload] || false
|
|
21
|
+
@send_flag = options[:send] || false
|
|
22
|
+
@macos_flag = false
|
|
23
|
+
|
|
24
|
+
# 接收外部传入的 JPS 配置
|
|
25
|
+
@app_info_obj = options[:app_info_obj]
|
|
26
|
+
@workflow_info = options[:workflow_info]
|
|
27
|
+
|
|
28
|
+
# 保存 Unity 根目录路径(用于查找 config.json)
|
|
29
|
+
@unity_root_path = options[:unity_root_path]
|
|
30
|
+
|
|
31
|
+
# AppStore 特有参数(可选)
|
|
32
|
+
@enable_appstore_prepare = options[:enable_appstore_prepare] || false
|
|
33
|
+
|
|
34
|
+
super(:ios, :release, options)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def build_task_name
|
|
40
|
+
"构建 IPA (Release)"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#准备构建
|
|
44
|
+
def prepare_build
|
|
45
|
+
# 如果启用 AppStore 准备,执行 AppStore 特有的准备工作
|
|
46
|
+
if @enable_appstore_prepare
|
|
47
|
+
prepare_appstore_specific
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def execute_build
|
|
52
|
+
configure_certificate
|
|
53
|
+
build_ios_project
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def find_output
|
|
57
|
+
build_path = File.join(@project_path, "build", "*.{ipa,app}")
|
|
58
|
+
ipa_files = Dir.glob(build_path)
|
|
59
|
+
|
|
60
|
+
if ipa_files.any?
|
|
61
|
+
latest_ipa = ipa_files.max_by { |f| File.mtime(f) }
|
|
62
|
+
puts " 找到 IPA 文件: #{latest_ipa}"
|
|
63
|
+
latest_ipa
|
|
64
|
+
else
|
|
65
|
+
puts " 警告: 未找到 IPA 文件"
|
|
66
|
+
nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# AppStore 特有的准备工作
|
|
73
|
+
def prepare_appstore_specific
|
|
74
|
+
Dir.chdir(@project_path)
|
|
75
|
+
|
|
76
|
+
# 1. 加载配置到 IosConfigParser 单例
|
|
77
|
+
load_ios_config
|
|
78
|
+
|
|
79
|
+
# 2. 自动增加版本号
|
|
80
|
+
auto_increase_buildnumber
|
|
81
|
+
|
|
82
|
+
# 3. 检查代码版本
|
|
83
|
+
check_code_version
|
|
84
|
+
|
|
85
|
+
# 4. 配置 Xcode 项目
|
|
86
|
+
configure_xcode_project
|
|
87
|
+
|
|
88
|
+
# 5. Quark/Swark 处理
|
|
89
|
+
handle_quswark_processing
|
|
90
|
+
|
|
91
|
+
# 6. 使用 appstore cert 命令
|
|
92
|
+
configure_appstore_certificate
|
|
93
|
+
|
|
94
|
+
# 7. 创建发布 tag
|
|
95
|
+
create_release_tag_for_appstore
|
|
96
|
+
|
|
97
|
+
# 8. Applovin 处理
|
|
98
|
+
handle_applovin_processing
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# 加载 iOS 配置
|
|
102
|
+
def load_ios_config
|
|
103
|
+
# 检查 IosConfigParser 是否已经加载了配置
|
|
104
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
105
|
+
if config_parser.config_json.nil?
|
|
106
|
+
# 如果没有加载,尝试从项目目录加载
|
|
107
|
+
config_file = File.join(@project_path, "config.json")
|
|
108
|
+
if File.exist?(config_file)
|
|
109
|
+
puts " 加载 iOS 配置..."
|
|
110
|
+
config_parser.load_config(config_file: config_file)
|
|
111
|
+
else
|
|
112
|
+
raise Informative, "配置文件不存在: #{config_file}"
|
|
113
|
+
end
|
|
114
|
+
else
|
|
115
|
+
puts " 使用已加载的配置..."
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# 自动增加版本号
|
|
120
|
+
def auto_increase_buildnumber
|
|
121
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
122
|
+
config_json = config_parser.config_json
|
|
123
|
+
return unless config_json
|
|
124
|
+
|
|
125
|
+
# 从全局配置获取 deploy_identifier
|
|
126
|
+
deploy_identifier = config_json.dig('project_info', 'deploy_identifier')
|
|
127
|
+
return unless deploy_identifier
|
|
128
|
+
|
|
129
|
+
puts " 自动增加版本号..."
|
|
130
|
+
|
|
131
|
+
# 从全局配置获取 pindo_dir
|
|
132
|
+
pindo_dir = File.expand_path(config_parser.pindo_dir)
|
|
133
|
+
app_config_repo_dir = File.join(pindo_dir, deploy_identifier)
|
|
134
|
+
|
|
135
|
+
# 增加项目目录的版本号
|
|
136
|
+
project_config_file = File.join(@project_path, "config.json")
|
|
137
|
+
if File.exist?(project_config_file)
|
|
138
|
+
increase_buildnumber_in_file(project_config_file)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# 增加配置仓库的版本号
|
|
142
|
+
app_config_file = File.join(app_config_repo_dir, "config.json")
|
|
143
|
+
if File.exist?(app_config_file)
|
|
144
|
+
increase_buildnumber_in_file(app_config_file)
|
|
145
|
+
|
|
146
|
+
# 提交到配置仓库
|
|
147
|
+
require 'pindo/module/build/git_repo_helper'
|
|
148
|
+
git_helper = Pindo::GitRepoHelper.share_instance
|
|
149
|
+
git_helper.git_addpush_repo(
|
|
150
|
+
path: app_config_repo_dir,
|
|
151
|
+
message: "increate build number",
|
|
152
|
+
commit_file_params: ["config.json"]
|
|
153
|
+
)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# 增加配置文件中的版本号
|
|
158
|
+
def increase_buildnumber_in_file(config_file)
|
|
159
|
+
config_json = JSON.parse(File.read(config_file))
|
|
160
|
+
|
|
161
|
+
if config_json["app_info"] && config_json["app_info"]["app_version"]
|
|
162
|
+
version_parts = config_json["app_info"]["app_version"].split(".")
|
|
163
|
+
if version_parts.length >= 3
|
|
164
|
+
build_number = version_parts[2].to_i + 1
|
|
165
|
+
version_parts[2] = build_number.to_s
|
|
166
|
+
config_json["app_info"]["app_version"] = version_parts.join(".")
|
|
167
|
+
|
|
168
|
+
File.write(config_file, JSON.pretty_generate(config_json))
|
|
169
|
+
puts " ✓ 版本号: #{config_json["app_info"]["app_version"]}"
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# 检查代码版本
|
|
175
|
+
def check_code_version
|
|
176
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
177
|
+
config_json = config_parser.config_json
|
|
178
|
+
return unless config_json
|
|
179
|
+
|
|
180
|
+
deploy_identifier = config_json.dig('project_info', 'deploy_identifier')
|
|
181
|
+
return unless deploy_identifier
|
|
182
|
+
|
|
183
|
+
puts " 检查代码版本..."
|
|
184
|
+
|
|
185
|
+
pindo_dir = File.expand_path(config_parser.pindo_dir)
|
|
186
|
+
app_config_dir = File.join(pindo_dir, deploy_identifier)
|
|
187
|
+
build_verify_file = File.join(app_config_dir, "build_verify.json")
|
|
188
|
+
|
|
189
|
+
build_verify_json = nil
|
|
190
|
+
begin
|
|
191
|
+
build_verify_json = JSON.parse(File.read(build_verify_file)) if File.exist?(build_verify_file)
|
|
192
|
+
rescue => error
|
|
193
|
+
build_verify_json = nil
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
require 'pindo/module/build/git_repo_helper'
|
|
197
|
+
git_helper = Pindo::GitRepoHelper.share_instance
|
|
198
|
+
release_code_commit = git_helper.git_latest_commit_id(local_repo_dir: @project_path)
|
|
199
|
+
|
|
200
|
+
if !release_code_commit.nil? && !build_verify_json.nil? && !build_verify_json["output_code_commit"].nil?
|
|
201
|
+
output_code_commit = build_verify_json["output_code_commit"]
|
|
202
|
+
if !release_code_commit.eql?(output_code_commit)
|
|
203
|
+
puts
|
|
204
|
+
puts " ⚠ 不是最新代码,请更新代码!"
|
|
205
|
+
puts " 当前 commit: #{release_code_commit}"
|
|
206
|
+
puts " 期望 commit: #{output_code_commit}"
|
|
207
|
+
puts
|
|
208
|
+
|
|
209
|
+
require 'highline/import'
|
|
210
|
+
answer = agree(" 请确认要用当前代码编译: (Y/n)")
|
|
211
|
+
unless answer
|
|
212
|
+
raise Informative, "请更新代码重新打包!"
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# 配置 Xcode 项目
|
|
219
|
+
def configure_xcode_project
|
|
220
|
+
puts " 配置 Xcode 项目..."
|
|
221
|
+
Pindo::XcodeBuildConfig.configure_xcode_project(project_dir: @project_path)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# 处理 Quark/Swark
|
|
225
|
+
def handle_quswark_processing
|
|
226
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
227
|
+
config_json = config_parser.config_json
|
|
228
|
+
return unless config_json
|
|
229
|
+
|
|
230
|
+
# 从 config_json 中判断是否需要处理 Quark/Swark
|
|
231
|
+
xcode_build_type = config_json.dig('project_info', 'xcode_build_type')
|
|
232
|
+
return unless xcode_build_type
|
|
233
|
+
|
|
234
|
+
build_type_array = xcode_build_type.split("_") || []
|
|
235
|
+
return unless build_type_array.include?("quark") || build_type_array.include?("swark")
|
|
236
|
+
|
|
237
|
+
puts " 处理 Quark/Swark..."
|
|
238
|
+
|
|
239
|
+
require 'pindo/module/xcode/xcode_swark_helper'
|
|
240
|
+
Dir.chdir(@project_path)
|
|
241
|
+
|
|
242
|
+
if xcode_build_type.include?("quark")
|
|
243
|
+
Pindo::XcodeSwarkHelper.quark_run(
|
|
244
|
+
project_dir: @project_path,
|
|
245
|
+
config_json: config_json,
|
|
246
|
+
build_type: 'release'
|
|
247
|
+
)
|
|
248
|
+
else
|
|
249
|
+
Pindo::XcodeSwarkHelper.swark_run(
|
|
250
|
+
project_dir: @project_path,
|
|
251
|
+
config_json: config_json,
|
|
252
|
+
build_type: 'release'
|
|
253
|
+
)
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# 配置 AppStore 证书
|
|
258
|
+
def configure_appstore_certificate
|
|
259
|
+
puts " 配置 AppStore 证书..."
|
|
260
|
+
Dir.chdir(@project_path)
|
|
261
|
+
|
|
262
|
+
# 使用 appstore cert 命令
|
|
263
|
+
Pindo::Command::Appstore::Cert.run([])
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# 创建发布 tag
|
|
267
|
+
def create_release_tag_for_appstore
|
|
268
|
+
puts " 创建发布 Tag..."
|
|
269
|
+
|
|
270
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
271
|
+
config_json = config_parser.config_json
|
|
272
|
+
bundle_id = config_parser.bundle_id
|
|
273
|
+
|
|
274
|
+
tag_helper = Object.new
|
|
275
|
+
tag_helper.extend(Pindo::XcodeAppConfig)
|
|
276
|
+
tag_helper.create_release_tag(
|
|
277
|
+
project_dir: @project_path,
|
|
278
|
+
config_json: config_json,
|
|
279
|
+
bundle_id: bundle_id
|
|
280
|
+
)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# 处理 Applovin
|
|
284
|
+
def handle_applovin_processing
|
|
285
|
+
pod_lock_file = File.join(@project_path, "Podfile.lock")
|
|
286
|
+
return unless File.exist?(pod_lock_file)
|
|
287
|
+
|
|
288
|
+
begin
|
|
289
|
+
require 'cocoapods'
|
|
290
|
+
pod_lock_json = Pod::YAMLHelper.load_file(pod_lock_file)
|
|
291
|
+
pods_array = []
|
|
292
|
+
|
|
293
|
+
if !pod_lock_json["SPEC REPOS"].nil?
|
|
294
|
+
pod_lock_json["SPEC REPOS"].each do |source, pod_items|
|
|
295
|
+
pods_array += pod_items
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
if pods_array.include?("FancyAD") || pods_array.include?("AppLovinSDK")
|
|
300
|
+
puts
|
|
301
|
+
puts " 运行 Applovin Script..."
|
|
302
|
+
Dir.chdir(@project_path)
|
|
303
|
+
|
|
304
|
+
applovin_args = []
|
|
305
|
+
applovin_args << "--appstore"
|
|
306
|
+
applovin_args << "--install"
|
|
307
|
+
Pindo::Command::Ios::Applovin.run(applovin_args)
|
|
308
|
+
end
|
|
309
|
+
rescue => e
|
|
310
|
+
puts " ⚠ Applovin 处理失败: #{e.message}"
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# 检测是否为 macOS 平台
|
|
315
|
+
def detect_macos_platform
|
|
316
|
+
project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
317
|
+
return if project_fullname.nil?
|
|
318
|
+
|
|
319
|
+
require 'xcodeproj'
|
|
320
|
+
project_obj = Xcodeproj::Project.open(project_fullname)
|
|
321
|
+
project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
|
|
322
|
+
|
|
323
|
+
if !project_build_platform.nil? && project_build_platform.eql?("macosx")
|
|
324
|
+
@macos_flag = true
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# 配置证书
|
|
329
|
+
def configure_certificate
|
|
330
|
+
detect_macos_platform
|
|
331
|
+
|
|
332
|
+
# 如果启用了 AppStore 准备,证书配置在 configure_appstore_certificate 中完成
|
|
333
|
+
if @enable_appstore_prepare
|
|
334
|
+
# 证书已在 configure_appstore_certificate 中配置
|
|
335
|
+
return
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
# 使用新的证书安装方法
|
|
339
|
+
# config.json 已经通过 pull_config 方法拉取到 @project_path 目录
|
|
340
|
+
require 'pindo/module/cert/xcode_cert_helper'
|
|
341
|
+
Pindo::XcodeCertHelper.install_and_config_certs(
|
|
342
|
+
build_type: 'release',
|
|
343
|
+
platform_type: @macos_flag ? 'macos' : 'ios',
|
|
344
|
+
project_dir: @project_path
|
|
345
|
+
)
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# 编译 iOS 工程
|
|
349
|
+
def build_ios_project
|
|
350
|
+
Dir.chdir(@project_path)
|
|
351
|
+
|
|
352
|
+
# 使用 XcodeBuildHelper 进行构建
|
|
353
|
+
ipa_file = Pindo::XcodeBuildHelper.build_project(
|
|
354
|
+
project_dir: @project_path,
|
|
355
|
+
icloud_id: nil
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
if ipa_file.nil?
|
|
359
|
+
raise Informative, "构建失败:未生成 IPA 文件"
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
puts "构建成功:#{ipa_file}"
|
|
363
|
+
ipa_file
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative '
|
|
1
|
+
require_relative 'ios_build_task'
|
|
2
2
|
require 'pindo/module/build/build_helper'
|
|
3
3
|
require 'pindo/module/build/version_helper'
|
|
4
4
|
require 'pindo/module/build/git_repo_helper'
|
|
@@ -10,7 +10,7 @@ module Pindo
|
|
|
10
10
|
module TaskSystem
|
|
11
11
|
# iOS Dev 模式构建任务
|
|
12
12
|
# 使用 Development 证书编译 iOS 工程
|
|
13
|
-
class
|
|
13
|
+
class IosBuildDevTask < IosBuildTask
|
|
14
14
|
def initialize(options = {})
|
|
15
15
|
@bundle_id = options[:bundle_id]
|
|
16
16
|
@proj_name = options[:proj_name]
|
|
@@ -148,17 +148,27 @@ module Pindo
|
|
|
148
148
|
|
|
149
149
|
# 拉取配置
|
|
150
150
|
def pull_config
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
Pindo::
|
|
151
|
+
return unless @bundle_id
|
|
152
|
+
|
|
153
|
+
build_helper = Pindo::BuildHelper.share_instance
|
|
154
|
+
build_helper.pull_appconfig_with_reponame(
|
|
155
|
+
repo_name: @bundle_id,
|
|
156
|
+
target_dir: @project_path
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# 重新加载配置到 IosConfigParser
|
|
160
|
+
config_file = File.join(@project_path, "config.json")
|
|
161
|
+
if File.exist?(config_file)
|
|
162
|
+
Pindo::IosConfigParser.instance.load_config(config_file: config_file)
|
|
163
|
+
else
|
|
164
|
+
raise Informative, "配置文件不存在: #{config_file}"
|
|
165
|
+
end
|
|
154
166
|
end
|
|
155
167
|
|
|
156
168
|
# 更新 Entitlements
|
|
157
169
|
def update_entitlements
|
|
158
|
-
config_json_file = File.join(@project_path, "config.json")
|
|
159
170
|
Pindo::XcodeBuildConfig.update_entitlements_config(
|
|
160
|
-
project_dir: @project_path
|
|
161
|
-
config_file: config_json_file
|
|
171
|
+
project_dir: @project_path
|
|
162
172
|
)
|
|
163
173
|
end
|
|
164
174
|
|
|
@@ -196,22 +206,14 @@ module Pindo
|
|
|
196
206
|
# 检查是否是 macOS 工程
|
|
197
207
|
detect_macos_platform
|
|
198
208
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
args_temp << config_path
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
# 切换到 iOS 工程目录,确保 Cert::run 能找到 xcodeproj
|
|
212
|
-
Dir.chdir(@project_path) do
|
|
213
|
-
Pindo::Command::Deploy::Cert::run(args_temp)
|
|
214
|
-
end
|
|
209
|
+
# 使用新的证书安装方法
|
|
210
|
+
# config.json 已经通过 pull_config 方法拉取到 @project_path 目录
|
|
211
|
+
require 'pindo/module/cert/xcode_cert_helper'
|
|
212
|
+
Pindo::XcodeCertHelper.install_and_config_certs(
|
|
213
|
+
build_type: 'dev',
|
|
214
|
+
platform_type: @macos_flag ? 'macos' : 'ios',
|
|
215
|
+
project_dir: @project_path
|
|
216
|
+
)
|
|
215
217
|
end
|
|
216
218
|
|
|
217
219
|
# 检测是否为 macOS 平台
|
|
@@ -241,10 +243,18 @@ module Pindo
|
|
|
241
243
|
def build_ios_project
|
|
242
244
|
Dir.chdir(@project_path)
|
|
243
245
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
+
# 使用 XcodeBuildHelper 进行构建
|
|
247
|
+
ipa_file = Pindo::XcodeBuildHelper.build_project(
|
|
248
|
+
project_dir: @project_path,
|
|
249
|
+
icloud_id: nil
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
if ipa_file.nil?
|
|
253
|
+
raise Informative, "构建失败:未生成 IPA 文件"
|
|
254
|
+
end
|
|
246
255
|
|
|
247
|
-
|
|
256
|
+
puts "构建成功:#{ipa_file}"
|
|
257
|
+
ipa_file
|
|
248
258
|
end
|
|
249
259
|
end
|
|
250
260
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require_relative '../build_task'
|
|
2
|
+
|
|
3
|
+
module Pindo
|
|
4
|
+
module TaskSystem
|
|
5
|
+
# iOS 构建任务基类
|
|
6
|
+
# 所有 iOS 平台构建任务的抽象基类
|
|
7
|
+
# 子类包括:IosBuildDevTask、IosBuildAdhocTask、IosBuildAppStoreTask
|
|
8
|
+
class IosBuildTask < BuildTask
|
|
9
|
+
# 空基类,仅用于类型标识
|
|
10
|
+
# 所有具体实现由子类完成
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -81,17 +81,17 @@ module Pindo
|
|
|
81
81
|
|
|
82
82
|
# 创建 iOS 构建任务
|
|
83
83
|
def self.create_ios_task(mode, options)
|
|
84
|
-
require_relative 'build/
|
|
85
|
-
require_relative 'build/
|
|
86
|
-
require_relative 'build/
|
|
84
|
+
require_relative 'build/ios_build_dev_task'
|
|
85
|
+
require_relative 'build/ios_build_adhoc_task'
|
|
86
|
+
require_relative 'build/ios_build_appstore_task'
|
|
87
87
|
|
|
88
88
|
case mode
|
|
89
89
|
when :dev
|
|
90
|
-
|
|
90
|
+
IosBuildDevTask.new(options)
|
|
91
91
|
when :adhoc
|
|
92
|
-
|
|
92
|
+
IosBuildAdhocTask.new(options)
|
|
93
93
|
when :release
|
|
94
|
-
|
|
94
|
+
IosBuildAppStoreTask.new(options)
|
|
95
95
|
else
|
|
96
96
|
raise ArgumentError, "不支持的 iOS 构建模式: #{mode}"
|
|
97
97
|
end
|
|
@@ -99,14 +99,17 @@ module Pindo
|
|
|
99
99
|
|
|
100
100
|
# 创建 Android 构建任务
|
|
101
101
|
def self.create_android_task(mode, options)
|
|
102
|
-
require_relative 'build/
|
|
103
|
-
require_relative 'build/
|
|
102
|
+
require_relative 'build/android_build_dev_task'
|
|
103
|
+
require_relative 'build/android_build_adhoc_task'
|
|
104
|
+
require_relative 'build/android_build_gplay_task'
|
|
104
105
|
|
|
105
106
|
case mode
|
|
106
107
|
when :dev, :debug
|
|
107
|
-
|
|
108
|
+
AndroidBuildDevTask.new(options)
|
|
109
|
+
when :adhoc
|
|
110
|
+
AndroidBuildAdhocTask.new(options)
|
|
108
111
|
when :release
|
|
109
|
-
|
|
112
|
+
AndroidBuildGPlayTask.new(options)
|
|
110
113
|
else
|
|
111
114
|
raise ArgumentError, "不支持的 Android 构建模式: #{mode}"
|
|
112
115
|
end
|
|
@@ -114,12 +117,12 @@ module Pindo
|
|
|
114
117
|
|
|
115
118
|
# 创建 Web 构建任务
|
|
116
119
|
def self.create_web_task(mode, options)
|
|
117
|
-
require_relative 'build/
|
|
120
|
+
require_relative 'build/web_build_dev_task'
|
|
118
121
|
|
|
119
122
|
case mode
|
|
120
123
|
when :dev, :debug, :release
|
|
121
124
|
# Web 目前只有一个构建任务类
|
|
122
|
-
|
|
125
|
+
WebBuildDevTask.new(options)
|
|
123
126
|
else
|
|
124
127
|
raise ArgumentError, "不支持的 Web 构建模式: #{mode}"
|
|
125
128
|
end
|