pindo 5.13.2 → 5.13.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.
- checksums.yaml +4 -4
- data/lib/pindo/command/appstore/adhocbuild.rb +14 -16
- data/lib/pindo/command/ios/applovin.rb +24 -182
- data/lib/pindo/command/ios/podupdate.rb +6 -37
- data/lib/pindo/module/cert/xcode_cert_helper.rb +7 -4
- data/lib/pindo/module/pgyer/pgyerhelper.rb +13 -5
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +219 -74
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +78 -104
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +17 -46
- data/lib/pindo/module/task/model/build/ios_build_task.rb +12 -2
- data/lib/pindo/module/xcode/applovin_xcode_helper.rb +271 -0
- data/lib/pindo/module/xcode/cocoapods_helper.rb +153 -0
- data/lib/pindo/module/xcode/xcode_app_config.rb +1 -1
- data/lib/pindo/module/xcode/xcode_swark_helper.rb +5 -5
- data/lib/pindo/version.rb +1 -1
- metadata +3 -1
|
@@ -4,6 +4,7 @@ require 'pindo/module/build/version_helper'
|
|
|
4
4
|
require 'pindo/module/build/git_repo_helper'
|
|
5
5
|
require 'pindo/module/xcode/xcode_build_config'
|
|
6
6
|
require 'pindo/module/xcode/xcode_build_helper'
|
|
7
|
+
require 'pindo/module/xcode/cocoapods_helper'
|
|
7
8
|
require 'pindo/module/pgyer/pgyerhelper'
|
|
8
9
|
|
|
9
10
|
module Pindo
|
|
@@ -45,12 +46,13 @@ module Pindo
|
|
|
45
46
|
update_version_info
|
|
46
47
|
pull_config
|
|
47
48
|
update_entitlements
|
|
48
|
-
|
|
49
|
+
|
|
49
50
|
end
|
|
50
51
|
|
|
51
52
|
def execute_build
|
|
52
53
|
configure_certificate
|
|
53
54
|
update_url_schemes_final
|
|
55
|
+
handle_cocoapods
|
|
54
56
|
build_ios_project
|
|
55
57
|
end
|
|
56
58
|
|
|
@@ -92,14 +94,6 @@ module Pindo
|
|
|
92
94
|
end
|
|
93
95
|
end
|
|
94
96
|
|
|
95
|
-
# 清理 Firebase Shell Script
|
|
96
|
-
def cleanup_firebase_shell
|
|
97
|
-
project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
98
|
-
if !project_fullname.nil? && File.exist?(project_fullname)
|
|
99
|
-
Pindo::XcodeBuildHelper.delete_libtarget_firebase_shell(@project_path)
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
97
|
# 更新工程配置
|
|
104
98
|
def update_project_config
|
|
105
99
|
workflow_packname = @workflow_info[:package_name]
|
|
@@ -146,23 +140,15 @@ module Pindo
|
|
|
146
140
|
end
|
|
147
141
|
end
|
|
148
142
|
|
|
149
|
-
#
|
|
143
|
+
# 检查配置
|
|
150
144
|
def pull_config
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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}"
|
|
145
|
+
# 检查 IosConfigParser 单例中是否已加载配置
|
|
146
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
147
|
+
if config_parser.config_json.nil?
|
|
148
|
+
raise Informative, "IosBuildDevTask 配置未加载,请确保在命令层已正确加载 config.json"
|
|
165
149
|
end
|
|
150
|
+
|
|
151
|
+
puts " 使用已加载的配置..."
|
|
166
152
|
end
|
|
167
153
|
|
|
168
154
|
# 更新 Entitlements
|
|
@@ -176,29 +162,14 @@ module Pindo
|
|
|
176
162
|
def handle_cocoapods
|
|
177
163
|
return unless File.exist?(File.join(@project_path, "Podfile"))
|
|
178
164
|
|
|
179
|
-
|
|
180
|
-
Pindo::
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
FileUtils.rm_rf(File.join(@project_path, "Podfile.lock")) if File.exist?(File.join(@project_path, "Podfile.lock"))
|
|
185
|
-
FileUtils.rm_rf(File.join(@project_path, "Pods")) if File.exist?(File.join(@project_path, "Pods"))
|
|
186
|
-
|
|
187
|
-
puts "正在执行 pod deintegrate..."
|
|
188
|
-
system 'pod deintegrate'
|
|
189
|
-
|
|
190
|
-
puts "正在执行 pod install..."
|
|
191
|
-
system 'pod install'
|
|
192
|
-
rescue => error
|
|
193
|
-
puts(error.to_s)
|
|
194
|
-
raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
|
|
195
|
-
end
|
|
165
|
+
# 1. 更新私有索引库
|
|
166
|
+
Pindo::CocoaPodsHelper.update_pod_repo(
|
|
167
|
+
install: false,
|
|
168
|
+
project_dir: @project_path
|
|
169
|
+
)
|
|
196
170
|
|
|
197
|
-
#
|
|
198
|
-
|
|
199
|
-
unless File.exist?(pod_lock_file)
|
|
200
|
-
raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
|
|
201
|
-
end
|
|
171
|
+
# 2. 清理并重新安装
|
|
172
|
+
Pindo::CocoaPodsHelper.deintegrate_and_install(@project_path)
|
|
202
173
|
end
|
|
203
174
|
|
|
204
175
|
# 配置证书
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative '../build_task'
|
|
2
|
+
require 'pindo/module/xcode/xcode_build_helper'
|
|
2
3
|
|
|
3
4
|
module Pindo
|
|
4
5
|
module TaskSystem
|
|
@@ -6,8 +7,17 @@ module Pindo
|
|
|
6
7
|
# 所有 iOS 平台构建任务的抽象基类
|
|
7
8
|
# 子类包括:IosBuildDevTask、IosBuildAdhocTask、IosBuildAppStoreTask
|
|
8
9
|
class IosBuildTask < BuildTask
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
|
|
11
|
+
protected
|
|
12
|
+
|
|
13
|
+
# 清理 Firebase Shell Script
|
|
14
|
+
# 删除 Xcode 项目中的 Firebase Shell Script Build Phase
|
|
15
|
+
def cleanup_firebase_shell
|
|
16
|
+
project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
17
|
+
if !project_fullname.nil? && File.exist?(project_fullname)
|
|
18
|
+
Pindo::XcodeBuildHelper.delete_libtarget_firebase_shell(@project_path)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
11
21
|
end
|
|
12
22
|
end
|
|
13
23
|
end
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'faraday'
|
|
4
|
+
require 'xcodeproj'
|
|
5
|
+
require 'pindo/base/git_handler'
|
|
6
|
+
require 'pindo/config/pindoconfig'
|
|
7
|
+
|
|
8
|
+
module Pindo
|
|
9
|
+
# Applovin Xcode 辅助类
|
|
10
|
+
# 封装 Applovin 相关的操作,包括:
|
|
11
|
+
# - 获取 SKAdNetwork IDs
|
|
12
|
+
# - 更新 Info.plist 文件
|
|
13
|
+
# - 运行 Applovin 安装脚本
|
|
14
|
+
class ApplovinXcodeHelper
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# 更新 Xcode 工程的 Applovin 配置
|
|
18
|
+
# @param project_dir [String] 项目目录,默认为当前目录
|
|
19
|
+
# @param appstore_mode [Boolean] 是否为 AppStore 模式
|
|
20
|
+
# @param install_script [Boolean] 是否运行安装脚本
|
|
21
|
+
# @param upload_config [Boolean] 是否保存配置到远程
|
|
22
|
+
# @return [Boolean] 是否成功
|
|
23
|
+
def update_applovin_config(project_dir: nil, appstore_mode: false, install_script: false, upload_config: false)
|
|
24
|
+
project_dir ||= Dir.pwd
|
|
25
|
+
|
|
26
|
+
# 1. 获取 SKAdNetwork IDs
|
|
27
|
+
skadnetwork_ids = fetch_skadnetwork_ids(upload_config: upload_config)
|
|
28
|
+
|
|
29
|
+
if skadnetwork_ids.nil? || skadnetwork_ids.empty?
|
|
30
|
+
puts "⚠ 未能获取 SKAdNetwork IDs"
|
|
31
|
+
return false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
puts "✓ 获取到 #{skadnetwork_ids.size} 条 SKAdNetwork IDs"
|
|
35
|
+
|
|
36
|
+
# 2. 更新 Info.plist
|
|
37
|
+
update_info_plist(project_dir: project_dir, skadnetwork_ids: skadnetwork_ids)
|
|
38
|
+
|
|
39
|
+
# 3. 运行安装脚本(可选)
|
|
40
|
+
if install_script
|
|
41
|
+
run_applovin_install_script(project_dir: project_dir, appstore_mode: appstore_mode)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# 获取 SKAdNetwork IDs
|
|
48
|
+
# @param upload_config [Boolean] 是否保存配置到远程
|
|
49
|
+
# @return [Array<String>] SKAdNetwork IDs 数组
|
|
50
|
+
def fetch_skadnetwork_ids(upload_config: false)
|
|
51
|
+
skadnetwork_ids = []
|
|
52
|
+
|
|
53
|
+
puts "正在请求 Applovin 数据..."
|
|
54
|
+
|
|
55
|
+
# 1. 请求 Applovin SKAdNetwork IDs
|
|
56
|
+
applovin_data = request_applovin_skadnetwork_ids
|
|
57
|
+
if applovin_data && applovin_data["skadnetwork_ids"]
|
|
58
|
+
applovin_data["skadnetwork_ids"].each do |network_id|
|
|
59
|
+
skadnetwork_ids << network_id["skadnetwork_id"]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# 2. 请求 Applovin Mediation SKAdNetwork IDs
|
|
64
|
+
mediation_data = request_applovin_mediation_skadnetwork_ids
|
|
65
|
+
if mediation_data && mediation_data["mediationSKAdnetworkIdsSpecs"]
|
|
66
|
+
mediation_data["mediationSKAdnetworkIdsSpecs"].each do |media_item|
|
|
67
|
+
skadnetwork_ids += media_item["skAdnetworkIds"]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# 3. 去重
|
|
72
|
+
skadnetwork_ids = skadnetwork_ids.uniq
|
|
73
|
+
|
|
74
|
+
puts "✓ 从网络获取到 #{skadnetwork_ids.size} 条数据"
|
|
75
|
+
|
|
76
|
+
# 4. 如果数据太少,从配置文件读取
|
|
77
|
+
if skadnetwork_ids.size <= 50
|
|
78
|
+
puts "网络数据太少,从缓存中获取..."
|
|
79
|
+
cached_ids = load_cached_skadnetwork_ids
|
|
80
|
+
skadnetwork_ids += cached_ids
|
|
81
|
+
skadnetwork_ids = skadnetwork_ids.uniq
|
|
82
|
+
puts "✓ 从缓存获取到 #{skadnetwork_ids.size} 条数据"
|
|
83
|
+
elsif upload_config
|
|
84
|
+
# 5. 保存到配置文件
|
|
85
|
+
save_skadnetwork_ids_to_config(skadnetwork_ids)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
skadnetwork_ids
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# 更新 Info.plist 文件
|
|
92
|
+
# @param project_dir [String] 项目目录
|
|
93
|
+
# @param skadnetwork_ids [Array<String>] SKAdNetwork IDs
|
|
94
|
+
def update_info_plist(project_dir:, skadnetwork_ids:)
|
|
95
|
+
puts "正在更新 Xcode Info.plist..."
|
|
96
|
+
|
|
97
|
+
# 1. 查找 Info.plist 文件
|
|
98
|
+
plist_file = find_info_plist(project_dir: project_dir)
|
|
99
|
+
|
|
100
|
+
unless File.exist?(plist_file)
|
|
101
|
+
puts "⚠ 未找到 Info.plist 文件: #{plist_file}"
|
|
102
|
+
return false
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# 2. 读取 Info.plist
|
|
106
|
+
info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file)
|
|
107
|
+
|
|
108
|
+
# 3. 更新配置
|
|
109
|
+
info_plist_dict["NSAdvertisingAttributionReportEndpoint"] ||= "https://postbacks-app.com"
|
|
110
|
+
|
|
111
|
+
if !info_plist_dict.has_key?("NSAppTransportSecurity")
|
|
112
|
+
info_plist_dict["NSAppTransportSecurity"] = {}
|
|
113
|
+
info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# 4. 更新 SKAdNetworkItems
|
|
117
|
+
if skadnetwork_ids && skadnetwork_ids.size > 0
|
|
118
|
+
info_plist_dict["SKAdNetworkItems"] = []
|
|
119
|
+
skadnetwork_ids.each do |network_id|
|
|
120
|
+
item = { "SKAdNetworkIdentifier" => network_id }
|
|
121
|
+
info_plist_dict["SKAdNetworkItems"] << item
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# 5. 写回 Info.plist
|
|
126
|
+
Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file)
|
|
127
|
+
|
|
128
|
+
puts "✓ Info.plist 更新完成"
|
|
129
|
+
true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# 运行 Applovin 安装脚本
|
|
133
|
+
# @param project_dir [String] 项目目录
|
|
134
|
+
# @param appstore_mode [Boolean] 是否为 AppStore 模式
|
|
135
|
+
def run_applovin_install_script(project_dir:, appstore_mode: false)
|
|
136
|
+
xcodeproj_file = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
137
|
+
return unless xcodeproj_file && File.exist?(xcodeproj_file)
|
|
138
|
+
|
|
139
|
+
pindo_common_dir = Pindoconfig.instance.pindo_common_configdir
|
|
140
|
+
|
|
141
|
+
# 选择脚本文件
|
|
142
|
+
script_name = appstore_mode ? "AppLovinQualityServiceSetup-ios.rb" : "AppLovinQualityServiceSetup-ios-dev.rb"
|
|
143
|
+
source_script = File.join(pindo_common_dir, script_name)
|
|
144
|
+
|
|
145
|
+
return unless File.exist?(source_script)
|
|
146
|
+
|
|
147
|
+
# 复制脚本到项目目录
|
|
148
|
+
project_script = File.join(project_dir, "AppLovinQualityServiceSetup-ios.rb")
|
|
149
|
+
FileUtils.cp_r(source_script, project_script)
|
|
150
|
+
|
|
151
|
+
# 运行脚本
|
|
152
|
+
puts "正在运行 Applovin 安装脚本..."
|
|
153
|
+
system("ruby #{project_script}")
|
|
154
|
+
puts "✓ Applovin 安装脚本执行完成"
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
private
|
|
158
|
+
|
|
159
|
+
# 请求 Applovin SKAdNetwork IDs
|
|
160
|
+
# @return [Hash, nil] JSON 数据
|
|
161
|
+
def request_applovin_skadnetwork_ids
|
|
162
|
+
begin
|
|
163
|
+
url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
|
|
164
|
+
conn = Faraday.new
|
|
165
|
+
response = conn.get do |req|
|
|
166
|
+
req.url url
|
|
167
|
+
req.headers['Content-Type'] = 'application/json'
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
JSON.parse(response.body)
|
|
171
|
+
rescue => e
|
|
172
|
+
puts "⚠ 请求 Applovin SKAdNetwork IDs 失败: #{e.message}"
|
|
173
|
+
nil
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# 请求 Applovin Mediation SKAdNetwork IDs
|
|
178
|
+
# @return [Hash, nil] JSON 数据
|
|
179
|
+
def request_applovin_mediation_skadnetwork_ids
|
|
180
|
+
begin
|
|
181
|
+
url = "https://dash.applovin.com/docs/v1/mediation_sk_adnetwork_ids"
|
|
182
|
+
conn = Faraday.new
|
|
183
|
+
response = conn.get do |req|
|
|
184
|
+
req.url url
|
|
185
|
+
req.headers['Content-Type'] = 'application/json'
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
JSON.parse(response.body)
|
|
189
|
+
rescue => e
|
|
190
|
+
puts "⚠ 请求 Applovin Mediation SKAdNetwork IDs 失败: #{e.message}"
|
|
191
|
+
nil
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# 从配置文件加载缓存的 SKAdNetwork IDs
|
|
196
|
+
# @return [Array<String>] SKAdNetwork IDs
|
|
197
|
+
def load_cached_skadnetwork_ids
|
|
198
|
+
config_file = File.join(Pindoconfig.instance.pindo_common_configdir, "applovin_client_config.json")
|
|
199
|
+
return [] unless File.exist?(config_file)
|
|
200
|
+
|
|
201
|
+
begin
|
|
202
|
+
config_json = JSON.parse(File.read(config_file))
|
|
203
|
+
config_json["SKAdNetworkItems"] || []
|
|
204
|
+
rescue => e
|
|
205
|
+
puts "⚠ 读取缓存配置失败: #{e.message}"
|
|
206
|
+
[]
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# 保存 SKAdNetwork IDs 到配置文件
|
|
211
|
+
# @param skadnetwork_ids [Array<String>] SKAdNetwork IDs
|
|
212
|
+
def save_skadnetwork_ids_to_config(skadnetwork_ids)
|
|
213
|
+
config_dir = Pindoconfig.instance.pindo_common_configdir
|
|
214
|
+
config_file = File.join(config_dir, "applovin_client_config.json")
|
|
215
|
+
|
|
216
|
+
# 读取原有配置
|
|
217
|
+
origin_json = {}
|
|
218
|
+
if File.exist?(config_file)
|
|
219
|
+
origin_json = JSON.parse(File.read(config_file))
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# 更新配置
|
|
223
|
+
origin_json["SKAdNetworkItems"] = skadnetwork_ids
|
|
224
|
+
|
|
225
|
+
# 写入文件
|
|
226
|
+
File.write(config_file, JSON.pretty_generate(origin_json))
|
|
227
|
+
|
|
228
|
+
# 提交到 Git
|
|
229
|
+
begin
|
|
230
|
+
Pindo::GitHandler.git_addpush_repo(
|
|
231
|
+
path: config_dir,
|
|
232
|
+
message: "Applovin SKAdNetworkItems",
|
|
233
|
+
commit_file_params: ["applovin_client_config.json"]
|
|
234
|
+
)
|
|
235
|
+
puts "✓ 配置已保存到远程仓库"
|
|
236
|
+
rescue => e
|
|
237
|
+
puts "⚠ 提交配置到 Git 失败: #{e.message}"
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# 查找 Info.plist 文件路径
|
|
242
|
+
# @param project_dir [String] 项目目录
|
|
243
|
+
# @return [String] Info.plist 文件路径
|
|
244
|
+
def find_info_plist(project_dir:)
|
|
245
|
+
# 默认路径
|
|
246
|
+
default_plist = File.join(project_dir, "AppEntry/Info.plist")
|
|
247
|
+
|
|
248
|
+
# 查找 .xcodeproj 文件
|
|
249
|
+
xcodeproj_file = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
250
|
+
return default_plist unless xcodeproj_file
|
|
251
|
+
|
|
252
|
+
# 从 Xcode 工程中查找 Info.plist
|
|
253
|
+
begin
|
|
254
|
+
proj_name = File.basename(xcodeproj_file, ".xcodeproj")
|
|
255
|
+
project_obj = Xcodeproj::Project.open(xcodeproj_file)
|
|
256
|
+
|
|
257
|
+
project_obj.targets.each do |target|
|
|
258
|
+
if target.product_type.to_s == "com.apple.product-type.application"
|
|
259
|
+
temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
|
|
260
|
+
return File.join(project_dir, temp_info) if temp_info
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
rescue => e
|
|
264
|
+
puts "⚠ 解析 Xcode 工程失败: #{e.message}"
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
default_plist
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
require 'cocoapods'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'pindo/base/git_handler'
|
|
4
|
+
require 'pindo/config/pindoconfig'
|
|
5
|
+
|
|
6
|
+
module Pindo
|
|
7
|
+
# CocoaPods 操作辅助类
|
|
8
|
+
# 封装 CocoaPods 相关的操作,包括:
|
|
9
|
+
# - 更新私有索引库
|
|
10
|
+
# - 同步 podspec
|
|
11
|
+
# - 执行 pod install
|
|
12
|
+
class CocoaPodsHelper
|
|
13
|
+
|
|
14
|
+
class << self
|
|
15
|
+
# 更新私有 Pod 索引库
|
|
16
|
+
# @param install [Boolean] 是否执行 pod install
|
|
17
|
+
# @param project_dir [String] 项目目录,默认为当前目录
|
|
18
|
+
# @return [Boolean] 是否成功
|
|
19
|
+
def update_pod_repo(install: false, project_dir: nil)
|
|
20
|
+
project_dir ||= Dir.pwd
|
|
21
|
+
|
|
22
|
+
# 获取私有 Pod 索引地址
|
|
23
|
+
pod_index_url = get_private_pod_index_url
|
|
24
|
+
raise "私有Pod索引地址未知!!" if pod_index_url.nil?
|
|
25
|
+
|
|
26
|
+
# 更新私有索引库
|
|
27
|
+
update_private_repo(pod_index_url)
|
|
28
|
+
|
|
29
|
+
# 如果需要,执行 pod install
|
|
30
|
+
if install
|
|
31
|
+
install_pods(project_dir)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# 执行 pod install
|
|
38
|
+
# @param project_dir [String] 项目目录
|
|
39
|
+
# @return [Boolean] 是否成功
|
|
40
|
+
def install_pods(project_dir)
|
|
41
|
+
podfile_path = File.join(project_dir, "Podfile")
|
|
42
|
+
return false unless File.exist?(podfile_path)
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
puts "正在执行 pod install..."
|
|
46
|
+
Dir.chdir(project_dir) do
|
|
47
|
+
Pod::Command::Install.run(['--clean-install'])
|
|
48
|
+
end
|
|
49
|
+
true
|
|
50
|
+
rescue => e
|
|
51
|
+
puts "Pod install 失败: #{e.message}"
|
|
52
|
+
false
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# 清理并重新安装 CocoaPods
|
|
57
|
+
# @param project_dir [String] 项目目录
|
|
58
|
+
def deintegrate_and_install(project_dir)
|
|
59
|
+
return unless File.exist?(File.join(project_dir, "Podfile"))
|
|
60
|
+
|
|
61
|
+
Dir.chdir(project_dir) do
|
|
62
|
+
begin
|
|
63
|
+
# 清理现有 Pods
|
|
64
|
+
FileUtils.rm_rf("Podfile.lock") if File.exist?("Podfile.lock")
|
|
65
|
+
FileUtils.rm_rf("Pods") if File.exist?("Pods")
|
|
66
|
+
|
|
67
|
+
puts "正在执行 pod deintegrate..."
|
|
68
|
+
system 'pod deintegrate'
|
|
69
|
+
|
|
70
|
+
puts "正在执行 pod install..."
|
|
71
|
+
system 'pod install'
|
|
72
|
+
|
|
73
|
+
# 检查 pod install 是否成功
|
|
74
|
+
unless File.exist?("Podfile.lock")
|
|
75
|
+
raise "pod install 失败!!先 pod install 完成后再编译!"
|
|
76
|
+
end
|
|
77
|
+
rescue => error
|
|
78
|
+
puts error.to_s
|
|
79
|
+
raise "pod install 失败!!先 pod install 完成后再编译!"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# 检查是否使用了特定的 Pod
|
|
85
|
+
# @param project_dir [String] 项目目录
|
|
86
|
+
# @param pod_names [Array<String>] Pod 名称列表
|
|
87
|
+
# @return [Boolean] 是否使用了任一指定的 Pod
|
|
88
|
+
def using_pods?(project_dir, pod_names)
|
|
89
|
+
pod_lock_file = File.join(project_dir, "Podfile.lock")
|
|
90
|
+
return false unless File.exist?(pod_lock_file)
|
|
91
|
+
|
|
92
|
+
begin
|
|
93
|
+
pod_lock_json = Pod::YAMLHelper.load_file(pod_lock_file)
|
|
94
|
+
pods_array = []
|
|
95
|
+
|
|
96
|
+
if !pod_lock_json["SPEC REPOS"].nil?
|
|
97
|
+
pod_lock_json["SPEC REPOS"].each do |source, pod_items|
|
|
98
|
+
pods_array += pod_items
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
pod_names.any? { |name| pods_array.include?(name) }
|
|
103
|
+
rescue => e
|
|
104
|
+
puts "检查 Podfile.lock 失败: #{e.message}"
|
|
105
|
+
false
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
# 获取私有 Pod 索引地址
|
|
112
|
+
# @return [String, nil] 索引地址
|
|
113
|
+
def get_private_pod_index_url
|
|
114
|
+
config = Pindoconfig.instance
|
|
115
|
+
pod_array = config.pod_repo_dict
|
|
116
|
+
return nil if pod_array.nil?
|
|
117
|
+
|
|
118
|
+
pod_array['podindex']
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# 更新私有索引库
|
|
122
|
+
# @param pod_index_url [String] 索引库地址
|
|
123
|
+
def update_private_repo(pod_index_url)
|
|
124
|
+
sources = Pod::Config.instance.sources_manager.all
|
|
125
|
+
repos_path = File.expand_path("~/.cocoapods/repos")
|
|
126
|
+
|
|
127
|
+
puts "私有Pod地址: #{pod_index_url}"
|
|
128
|
+
puts "私有Pod目录: ~/.cocoapods"
|
|
129
|
+
|
|
130
|
+
# 查找已存在的私有源
|
|
131
|
+
private_source = sources.select { |s| s.git? && s.url.to_s.eql?(pod_index_url) }.first
|
|
132
|
+
|
|
133
|
+
if !private_source.nil?
|
|
134
|
+
# 更新已存在的私有源
|
|
135
|
+
repo_name = File.basename(private_source.repo)
|
|
136
|
+
Pindo::GitHandler.getcode_to_dir(
|
|
137
|
+
reponame: repo_name,
|
|
138
|
+
remote_url: pod_index_url,
|
|
139
|
+
path: repos_path
|
|
140
|
+
)
|
|
141
|
+
else
|
|
142
|
+
# 添加新的私有源
|
|
143
|
+
repository_name = pod_index_url.split("/").last.chomp(".git")
|
|
144
|
+
Pindo::GitHandler.getcode_to_dir(
|
|
145
|
+
reponame: repository_name,
|
|
146
|
+
remote_url: pod_index_url,
|
|
147
|
+
path: repos_path
|
|
148
|
+
)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -221,7 +221,7 @@ module Pindo
|
|
|
221
221
|
require_relative '../../base/funlog'
|
|
222
222
|
|
|
223
223
|
begin
|
|
224
|
-
pindo_dir = File.expand_path(Pindo::
|
|
224
|
+
pindo_dir = File.expand_path(Pindo::Pindoconfig.instance.pindo_dir)
|
|
225
225
|
app_config_dir = File.join(pindo_dir, bundle_id)
|
|
226
226
|
|
|
227
227
|
# 如果指定了要删除的 tag
|
|
@@ -150,8 +150,8 @@ module Pindo
|
|
|
150
150
|
|
|
151
151
|
# 1. 设置 Swark 环境
|
|
152
152
|
require 'pindo/config/pindoconfig'
|
|
153
|
-
pindo_dir = Pindo::
|
|
154
|
-
swark_git_url = Pindo::
|
|
153
|
+
pindo_dir = Pindo::Pindoconfig.instance.pindo_dir
|
|
154
|
+
swark_git_url = Pindo::Pindoconfig.instance.deploy_swark_giturl
|
|
155
155
|
setup_swark_env(pindo_dir: pindo_dir, swark_git_url: swark_git_url)
|
|
156
156
|
|
|
157
157
|
# 2. 运行 Swark 授权
|
|
@@ -225,8 +225,8 @@ module Pindo
|
|
|
225
225
|
|
|
226
226
|
# 1. 设置 Quark 环境
|
|
227
227
|
require 'pindo/config/pindoconfig'
|
|
228
|
-
pindo_dir = Pindo::
|
|
229
|
-
quark_git_url = Pindo::
|
|
228
|
+
pindo_dir = Pindo::Pindoconfig.instance.pindo_dir
|
|
229
|
+
quark_git_url = Pindo::Pindoconfig.instance.deploy_quark_giturl
|
|
230
230
|
setup_quark_env(pindo_dir: pindo_dir, quark_git_url: quark_git_url)
|
|
231
231
|
|
|
232
232
|
# 2. 运行 quark host 命令
|
|
@@ -290,7 +290,7 @@ module Pindo
|
|
|
290
290
|
begin
|
|
291
291
|
Funlog.instance.fancyinfo_start("正在执行 Swark 授权...")
|
|
292
292
|
|
|
293
|
-
pindo_dir = Pindo::
|
|
293
|
+
pindo_dir = Pindo::Pindoconfig.instance.pindo_dir
|
|
294
294
|
app_config_dir = File.join(File.expand_path(pindo_dir), bundle_id)
|
|
295
295
|
swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")
|
|
296
296
|
|
data/lib/pindo/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pindo
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.13.
|
|
4
|
+
version: 5.13.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- wade
|
|
@@ -456,6 +456,8 @@ files:
|
|
|
456
456
|
- lib/pindo/module/webserver/responsive_preview_handler.rb
|
|
457
457
|
- lib/pindo/module/webserver/webgl_page_handler.rb
|
|
458
458
|
- lib/pindo/module/webserver/webgl_server_helper.rb
|
|
459
|
+
- lib/pindo/module/xcode/applovin_xcode_helper.rb
|
|
460
|
+
- lib/pindo/module/xcode/cocoapods_helper.rb
|
|
459
461
|
- lib/pindo/module/xcode/ipa_resign_helper.rb
|
|
460
462
|
- lib/pindo/module/xcode/res/xcode_res_constant.rb
|
|
461
463
|
- lib/pindo/module/xcode/res/xcode_res_handler.rb
|