Class: Pindo::XcodeSwarkHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/module/xcode/xcode_swark_helper.rb

Overview

Xcode Swark/Quark 辅助工具类用于配置和运行 Quark 和 Swark 开发环境

Class Method Summary collapse

Class Method Details

.get_repo_base_name(repo_url:) ⇒ String

从 Git URL 中提取仓库基础名称

Parameters:

  • repo_url (String)

    Git 仓库 URL

Returns:

  • (String)

    仓库基础名称



128
129
130
131
132
133
134
135
136
137
138
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 128

def self.get_repo_base_name(repo_url:)
  return nil if repo_url.nil? || repo_url.empty?

  # 移除 .git 后缀
  base_name = repo_url.sub(/\.git$/, '')

  # 提取最后一个路径部分
  base_name = base_name.split('/').last

  base_name
end

.quark_run(project_dir:, config_json:, build_type: 'release') ⇒ Boolean

运行 Quark 配置

Parameters:

  • project_dir (String)

    项目目录

  • config_json (Hash)

    配置 JSON 数据

  • build_type (String) (defaults to: 'release')

    构建类型 (dev/adhoc/release)

Returns:

  • (Boolean)

    是否成功



220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 220

def self.quark_run(project_dir:, config_json:, build_type: 'release')
  require_relative '../../base/funlog'

  begin
    Funlog.instance.fancyinfo_start("正在配置 Quark 环境...")

    # 1. 设置 Quark 环境
    require 'pindo/config/pindoconfig'
    pindo_dir = Pindo::Pindoconfig.instance.pindo_dir
    quark_git_url = Pindo::Pindoconfig.instance.deploy_quark_giturl
    setup_quark_env(pindo_dir: pindo_dir, quark_git_url: quark_git_url)

    # 2. 运行 quark host 命令
    # dev 使用 test 模式,其他使用 prod 模式
    quark_mode = (build_type == 'dev') ? 'test' : 'prod'
    command = "quark host #{quark_mode}"

    Funlog.instance.fancyinfo("执行命令: #{command}")
    system command

    # 3. 修改 Quark.lock 文件
    quark_json_file = File.join(project_dir, "QuarkData/Quark.lock")
    unless File.exist?(quark_json_file)
      Funlog.instance.fancyinfo_warning("未找到 Quark.lock 文件: #{quark_json_file}")
      return false
    end

    quark_json = JSON.parse(File.read(quark_json_file))

    # 设置 remote URL
    if config_json && config_json['app_setting'] && config_json['app_setting']['app_client_url']
      quark_json['remote'] = File.join(config_json['app_setting']['app_client_url'], 'api/init')
    end

    # 设置 embed 和 category 名称
    embed_name = "Meety.dat"
    category_name = "PodsDummy"
    if config_json['project_info'] && config_json['project_info']['project_name']
      category_name = config_json['project_info']['project_name']
      category_name = category_name.gsub(/ /, '').gsub(/\'/, '')
      embed_name = category_name + ".dat"
    end

    quark_json['embed'] = embed_name
    quark_json['category'] = category_name
    quark_json['env'] = quark_mode

    # 写入文件
    File.open(quark_json_file, "w") do |file|
      file.write(JSON.pretty_generate(quark_json))
    end

    Funlog.instance.fancyinfo_success("Quark 配置完成!")
    return true

  rescue StandardError => e
    Funlog.instance.fancyinfo_error("Quark 配置失败: #{e.message}")
    puts e.backtrace
    return false
  end
end

.setup_quark_env(pindo_dir:, quark_git_url:) ⇒ Boolean

配置 Quark 开发环境

Parameters:

  • pindo_dir (String)

    Pindo 工作目录

  • quark_git_url (String)

    Quark Git 仓库 URL

Returns:

  • (Boolean)

    是否配置成功



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 14

def self.setup_quark_env(pindo_dir:, quark_git_url:)
  require 'pindo/base/git_handler'
  require_relative '../../base/funlog'

  begin
    # 确保 pindo 目录存在
    FileUtils.mkdir_p(pindo_dir) unless File.exist?(pindo_dir)

    Funlog.instance.fancyinfo_start("正在配置 Quark 开发环境...")

    # 获取仓库名称
    reponame = get_repo_base_name(repo_url: quark_git_url)

    # 克隆或更新 Quark 仓库
    quark_path = Pindo::GitHandler.getcode_to_dir(
      reponame: reponame,
      remote_url: quark_git_url,
      path: pindo_dir,
      new_branch: nil
    )

    # 执行 quark-install
    install_command = File.join(quark_path, 'quark-install')
    if File.exist?(install_command)
      Funlog.instance.fancyinfo("执行 quark-install...")
      system "/bin/chmod 777 #{install_command}"
      system install_command
    else
      Funlog.instance.fancyinfo_warning("未找到 quark-install 文件: #{install_command}")
    end

    # 执行 quark-upgrade
    upgrade_command = File.join(quark_path, 'quark-upgrade')
    if File.exist?(upgrade_command)
      Funlog.instance.fancyinfo("执行 quark-upgrade...")
      system "/bin/chmod 777 #{upgrade_command}"
      system upgrade_command
    else
      Funlog.instance.fancyinfo_warning("未找到 quark-upgrade 文件: #{upgrade_command}")
    end

    Funlog.instance.fancyinfo_success("Quark 开发环境配置完成!")
    return true

  rescue StandardError => e
    Funlog.instance.fancyinfo_error("配置 Quark 环境失败: #{e.message}")
    puts e.backtrace
    return false
  end
end

.setup_swark_env(pindo_dir:, swark_git_url:) ⇒ Boolean

配置 Swark 开发环境

Parameters:

  • pindo_dir (String)

    Pindo 工作目录

  • swark_git_url (String)

    Swark Git 仓库 URL

Returns:

  • (Boolean)

    是否配置成功



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 69

def self.setup_swark_env(pindo_dir:, swark_git_url:)
  require 'pindo/base/git_handler'
  require_relative '../../base/funlog'

  begin
    # 确保 swark 目录存在
    swark_dir = File.expand_path(pindo_dir)
    FileUtils.mkdir_p(swark_dir) unless File.exist?(swark_dir)

    Funlog.instance.fancyinfo_start("正在配置 Swark 开发环境...")

    # 获取仓库名称
    reponame = get_repo_base_name(repo_url: swark_git_url)

    # 克隆或更新 Swark 仓库(强制使用 swark-toolchain-lite 作为目录名)
    swark_path = Pindo::GitHandler.getcode_to_dir(
      reponame: 'swark-toolchain-lite',
      remote_url: swark_git_url,
      path: swark_dir,
      new_branch: nil
    )

    # 执行 install
    install_command = File.join(swark_path, 'install')
    if File.exist?(install_command)
      Funlog.instance.fancyinfo("执行 swark install...")
      system "/bin/chmod 777 #{install_command}"
      system install_command
    else
      Funlog.instance.fancyinfo_warning("未找到 install 文件: #{install_command}")
    end

    # 执行 swark-upgrade
    swark_exe_dir = File.expand_path("~")
    upgrade_command = File.join(swark_exe_dir, 'swark-toolchain/tools/swark-upgrade')
    if File.exist?(upgrade_command)
      Funlog.instance.fancyinfo("执行 swark-upgrade...")
      puts "升级命令: #{upgrade_command}"
      system "/bin/chmod 777 #{upgrade_command}"
      system upgrade_command
    else
      Funlog.instance.fancyinfo_warning("未找到 swark-upgrade 文件: #{upgrade_command}")
    end

    Funlog.instance.fancyinfo_success("Swark 开发环境配置完成!")
    return true

  rescue StandardError => e
    Funlog.instance.fancyinfo_error("配置 Swark 环境失败: #{e.message}")
    puts e.backtrace
    return false
  end
end

.swark_authorize_run(bundle_id:) ⇒ Boolean

运行 Swark 授权

Parameters:

  • bundle_id (String)

    Bundle ID

Returns:

  • (Boolean)

    是否成功



285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 285

def self.swark_authorize_run(bundle_id:)
  require_relative '../../base/funlog'
  require 'pindo/base/git_handler'
  require 'pindo/config/pindoconfig'
  require 'pindo/config/ios_config_parser'

  begin
    Funlog.instance.fancyinfo_start("正在执行 Swark 授权...")

    pindo_dir = Pindo::Pindoconfig.instance.pindo_dir

    # 使用原始 Bundle ID(app_repo_name)访问配置仓库
    # 在 AdHoc 构建中,bundle_id 参数已被替换为 AdHoc Bundle ID
    # 需要使用 app_repo_name(原始 Bundle ID)访问正确的配置仓库
    config_parser = Pindo::IosConfigParser.instance
    app_repo_name = config_parser.app_repo_name || bundle_id  # 回退到参数 bundle_id 以兼容独立命令

    app_config_dir = File.join(File.expand_path(pindo_dir), app_repo_name)
    swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")

    unless File.exist?(swark_authorize_file)
      Funlog.instance.fancyinfo_warning("未找到 swark_authorize.json 文件: #{swark_authorize_file}")
      return false
    end

    swark_authorize_json = JSON.parse(File.read(swark_authorize_file))

    # 检查是否已经授权
    if swark_authorize_json && swark_authorize_json['swark_authorize_status']
      Funlog.instance.fancyinfo("Swark 已经授权过了")
      return true
    end

    # 执行授权命令
    command = "swark authorize "
    command += swark_authorize_json["swark_authorize_teamid"] + "." + swark_authorize_json["swark_authorize_bundleid"]

    Funlog.instance.fancyinfo("执行命令: #{command}")
    puts
    puts
    puts command
    puts
    system command

    # 更新授权状态
    swark_authorize_json['swark_authorize_status'] = true
    File.open(swark_authorize_file, "w") do |f|
      f.write(JSON.pretty_generate(swark_authorize_json))
    end

    # 提交到配置仓库
    Pindo::GitHandler.git_addpush_repo(path: app_config_dir, message: "swark authorize success !!!")

    Funlog.instance.fancyinfo_success("Swark 授权完成!")
    return true

  rescue StandardError => e
    Funlog.instance.fancyinfo_error("Swark 授权失败: #{e.message}")
    puts e.backtrace
    return false
  end
end

.swark_run(project_dir:, config_json:, build_type: 'release') ⇒ Boolean

运行 Swark 配置

Parameters:

  • project_dir (String)

    项目目录

  • config_json (Hash)

    配置 JSON 数据

  • build_type (String) (defaults to: 'release')

    构建类型 (dev/adhoc/release)

Returns:

  • (Boolean)

    是否成功



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/pindo/module/xcode/xcode_swark_helper.rb', line 145

def self.swark_run(project_dir:, config_json:, build_type: 'release')
  require_relative '../../base/funlog'

  begin
    Funlog.instance.fancyinfo_start("正在配置 Swark 环境...")

    # 1. 设置 Swark 环境
    require 'pindo/config/pindoconfig'
    pindo_dir = Pindo::Pindoconfig.instance.pindo_dir
    swark_git_url = Pindo::Pindoconfig.instance.deploy_swark_giturl
    setup_swark_env(pindo_dir: pindo_dir, swark_git_url: swark_git_url)

    # 2. 运行 Swark 授权
    bundle_id = config_json['app_info']['app_identifier'] if config_json && config_json['app_info']
    if bundle_id && !bundle_id.empty?
      swark_authorize_run(bundle_id: bundle_id)
    end

    # 3. 创建 Swark.host.yaml 配置文件
    swark_host_name = File.join(project_dir, "Swark.host.yaml")
    host_json = {}
    host_json["remote"] = {}
    host_json["remote"]["test"] = ""

    # 获取 host URL
    host_url = ""
    if config_json && config_json['app_setting']
      if config_json['app_setting']['app_client_url']
        host_url = File.join(config_json['app_setting']['app_client_url'], 'api/v3/init')
      elsif config_json['app_setting']['kGUKeyAppClientHost']
        host_url = File.join(config_json['app_setting']['kGUKeyAppClientHost'], 'api/v3/init')
      end
    end

    host_json["remote"]["pre"] = host_url
    host_json["remote"]["prod"] = host_url

    # 设置 embed 名称
    embed_name = "vdisk.dat"
    category_name = "VMDemo"
    if config_json['project_info'] && config_json['project_info']['project_name']
      category_name = config_json['project_info']['project_name']
      category_name = category_name.gsub(/ /, '').gsub(/\'/, '')
      embed_name = category_name + ".dat"
    end
    host_json["embed"] = embed_name

    # 写入 YAML 文件
    File.open(swark_host_name, "w") do |file|
      YAML.dump(host_json, file)
    end

    # 4. 运行 swark host 命令
    # dev 使用 pre 模式,其他使用 prod 模式
    swark_mode = (build_type == 'dev') ? 'pre' : 'prod'
    command = "swark host #{swark_mode}"

    Funlog.instance.fancyinfo("执行命令: #{command}")
    system command

    Funlog.instance.fancyinfo_success("Swark 配置完成!")
    return true

  rescue StandardError => e
    Funlog.instance.fancyinfo_error("Swark 配置失败: #{e.message}")
    puts e.backtrace
    return false
  end
end