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
|
@@ -364,12 +364,18 @@ module Pindo
|
|
|
364
364
|
# 更新entitlements配置
|
|
365
365
|
# 根据entitlements文件内容,同步更新config.json中的配置
|
|
366
366
|
# 如果entitlements中没有icloud或app group,则从config.json中移除对应配置
|
|
367
|
+
# 使用 IosConfigParser 单例类获取和更新配置
|
|
367
368
|
# @param project_dir [String] 项目目录路径
|
|
368
|
-
# @param config_file [String] config.json文件路径
|
|
369
369
|
# @return [Boolean] 是否成功更新
|
|
370
|
-
def self.update_entitlements_config(project_dir: nil
|
|
370
|
+
def self.update_entitlements_config(project_dir: nil)
|
|
371
371
|
raise ArgumentError, "项目目录不能为空" if project_dir.nil?
|
|
372
|
-
|
|
372
|
+
|
|
373
|
+
# 使用 IosConfigParser 单例获取配置
|
|
374
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
375
|
+
config_json = config_parser.config_json
|
|
376
|
+
config_file_path = config_parser.config_file_path
|
|
377
|
+
|
|
378
|
+
return false if config_json.nil? || config_file_path.nil?
|
|
373
379
|
|
|
374
380
|
project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
|
375
381
|
return false if project_fullname.nil?
|
|
@@ -389,13 +395,6 @@ module Pindo
|
|
|
389
395
|
|
|
390
396
|
# 处理entitlements配置
|
|
391
397
|
if entitlements_plist_path && File.exist?(entitlements_plist_path)
|
|
392
|
-
config_json = nil
|
|
393
|
-
if File.exist?(config_file)
|
|
394
|
-
config_json = JSON.parse(File.read(config_file))
|
|
395
|
-
end
|
|
396
|
-
|
|
397
|
-
return false if config_json.nil?
|
|
398
|
-
|
|
399
398
|
entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
|
|
400
399
|
|
|
401
400
|
# 如果entitlements中没有icloud配置,从config.json中移除
|
|
@@ -413,7 +412,7 @@ module Pindo
|
|
|
413
412
|
end
|
|
414
413
|
|
|
415
414
|
# 保存更新后的config.json
|
|
416
|
-
File.open(
|
|
415
|
+
File.open(config_file_path, "w") do |f|
|
|
417
416
|
f.write(JSON.pretty_generate(config_json))
|
|
418
417
|
end
|
|
419
418
|
|
|
@@ -442,13 +441,15 @@ module Pindo
|
|
|
442
441
|
puts "\n检测到项目 Icon URL: #{icon_url}"
|
|
443
442
|
|
|
444
443
|
# 创建临时目录(所有 icon 处理都在此目录内完成)
|
|
445
|
-
temp_icon_dir = File.join(project_dir, ".
|
|
444
|
+
temp_icon_dir = File.join(project_dir, ".pindo_temp_ios_icon")
|
|
446
445
|
icon_download_path = nil
|
|
447
446
|
replace_success = false
|
|
448
447
|
|
|
449
448
|
begin
|
|
450
|
-
|
|
451
|
-
|
|
449
|
+
# 先清理旧的临时目录,确保干净的环境
|
|
450
|
+
FileUtils.rm_rf(temp_icon_dir) if File.exist?(temp_icon_dir)
|
|
451
|
+
FileUtils.mkdir_p(temp_icon_dir)
|
|
452
|
+
icon_download_path = File.join(temp_icon_dir, "ios_downloaded_icon.png")
|
|
452
453
|
|
|
453
454
|
# 使用带重试机制的下载
|
|
454
455
|
unless IconDownloader.download_icon_with_retry(icon_url: icon_url, save_path: icon_download_path, max_retries: 3)
|
|
@@ -456,8 +457,10 @@ module Pindo
|
|
|
456
457
|
return false
|
|
457
458
|
end
|
|
458
459
|
|
|
459
|
-
# 生成新的 icon
|
|
460
|
-
new_icon_dir = File.join(temp_icon_dir, "
|
|
460
|
+
# 生成新的 icon 目录(放在临时目录内部),先清理确保干净环境
|
|
461
|
+
new_icon_dir = File.join(temp_icon_dir, "ios_generated_icons")
|
|
462
|
+
FileUtils.rm_rf(new_icon_dir) if File.exist?(new_icon_dir)
|
|
463
|
+
FileUtils.mkdir_p(new_icon_dir)
|
|
461
464
|
|
|
462
465
|
# 创建各种尺寸的 icon
|
|
463
466
|
Funlog.instance.fancyinfo_start("正在创建 icon...")
|
|
@@ -482,12 +485,144 @@ module Pindo
|
|
|
482
485
|
replace_success = false
|
|
483
486
|
ensure
|
|
484
487
|
# 清理临时文件(无论成功失败都清理)
|
|
485
|
-
|
|
488
|
+
FileUtils.rm_rf(temp_icon_dir) if temp_icon_dir && File.exist?(temp_icon_dir)
|
|
486
489
|
end
|
|
487
490
|
|
|
488
491
|
return replace_success
|
|
489
492
|
end
|
|
490
493
|
|
|
494
|
+
# 配置 Xcode 项目(封装 configproj 的核心逻辑)
|
|
495
|
+
# 注意:调用此方法前必须先通过 IosConfigParser.instance.load_config 加载配置
|
|
496
|
+
# @param project_dir [String] 项目目录
|
|
497
|
+
# @return [Boolean] 是否成功
|
|
498
|
+
def self.configure_xcode_project(project_dir:)
|
|
499
|
+
require 'pindo/config/ios_config_parser'
|
|
500
|
+
require 'pindo/module/xcode/xcode_build_helper'
|
|
501
|
+
require 'pindo/module/xcode/xcode_res_helper'
|
|
502
|
+
require 'pindo/module/xcode/xcode_app_config'
|
|
503
|
+
require 'pindo/module/build/swark_helper'
|
|
504
|
+
require 'pindo/base/git_handler'
|
|
505
|
+
|
|
506
|
+
# 使用已加载的 IosConfigParser 单例
|
|
507
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
508
|
+
config_json = config_parser.config_json
|
|
509
|
+
bundle_id = config_parser.bundle_id
|
|
510
|
+
|
|
511
|
+
# 验证配置已加载
|
|
512
|
+
if config_json.nil? || config_json.empty?
|
|
513
|
+
raise Informative, "配置未加载,请先调用 IosConfigParser.instance.load_config"
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
if bundle_id.nil? || bundle_id.empty?
|
|
517
|
+
raise Informative, "无法从配置中获取 Bundle ID"
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
# 获取项目名称
|
|
521
|
+
project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
|
522
|
+
if project_fullname.nil? || !File.exist?(project_fullname)
|
|
523
|
+
raise Informative, "找不到 .xcodeproj 文件,请检查项目目录"
|
|
524
|
+
end
|
|
525
|
+
proj_name = File.basename(project_fullname, ".xcodeproj")
|
|
526
|
+
|
|
527
|
+
# 1. 安装 Google Plist
|
|
528
|
+
Funlog.instance.fancyinfo_start("正在替换 google-info.plist...")
|
|
529
|
+
google_info_config_dir = Pindo::GitHandler.clong_buildconfig_repo(repo_name: bundle_id)
|
|
530
|
+
Pindo::XcodeBuildHelper.install_google_plist(
|
|
531
|
+
project_dir: project_dir,
|
|
532
|
+
app_config_dir: google_info_config_dir
|
|
533
|
+
)
|
|
534
|
+
Funlog.instance.fancyinfo_success("替换 google-info.plist 完成!")
|
|
535
|
+
|
|
536
|
+
# 2. 创建和替换 Icon
|
|
537
|
+
app_config_dir = google_info_config_dir
|
|
538
|
+
icon_name = File.join(app_config_dir, "fastlane", "icon.png")
|
|
539
|
+
if File.exist?(icon_name)
|
|
540
|
+
time = Time.now.strftime('%m%d-%H%M%S')
|
|
541
|
+
new_icon_dir = File.join(project_dir, "icon_#{time}")
|
|
542
|
+
|
|
543
|
+
Funlog.instance.fancyinfo_start("正在创建 icon...")
|
|
544
|
+
Pindo::XcodeResHelper.create_icons(icon_name: icon_name, new_icon_dir: new_icon_dir)
|
|
545
|
+
Funlog.instance.fancyinfo_success("创建 icon 完成!")
|
|
546
|
+
|
|
547
|
+
Funlog.instance.fancyinfo_start("正在替换 icon...")
|
|
548
|
+
Pindo::XcodeResHelper.install_icon(proj_dir: project_dir, new_icon_dir: new_icon_dir)
|
|
549
|
+
Funlog.instance.fancyinfo_success("替换 icon 完成!")
|
|
550
|
+
|
|
551
|
+
begin
|
|
552
|
+
FileUtils.rm_rf(new_icon_dir)
|
|
553
|
+
rescue StandardError => err
|
|
554
|
+
# 忽略清理错误
|
|
555
|
+
end
|
|
556
|
+
else
|
|
557
|
+
Funlog.instance.fancyinfo_warning("未找到 icon 文件: #{icon_name}")
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
# 3. 替换启动页
|
|
561
|
+
Funlog.instance.fancyinfo_start("正在替换启动页...")
|
|
562
|
+
launchimg_pub_path = File.join(app_config_dir, "launch")
|
|
563
|
+
if Dir.exist?(launchimg_pub_path)
|
|
564
|
+
Pindo::XcodeResHelper.install_launchimg(
|
|
565
|
+
proj_dir: project_dir,
|
|
566
|
+
launchimg_pub_path: launchimg_pub_path
|
|
567
|
+
)
|
|
568
|
+
Funlog.instance.fancyinfo_success("启动页处理完成!")
|
|
569
|
+
else
|
|
570
|
+
Funlog.instance.fancyinfo_warning("未找到启动页目录: #{launchimg_pub_path}")
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
# 4. 添加项目模块
|
|
574
|
+
# 需要 include XcodeAppConfig 模块的方法,这里创建一个临时对象
|
|
575
|
+
config_helper = Object.new
|
|
576
|
+
config_helper.extend(Pindo::XcodeAppConfig)
|
|
577
|
+
config_helper.add_project_modue(
|
|
578
|
+
project_dir: project_dir,
|
|
579
|
+
proj_name: proj_name,
|
|
580
|
+
config_json: config_json
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
# 5. 修改 Info.plist
|
|
584
|
+
Funlog.instance.fancyinfo_start("正在修改工程配置...")
|
|
585
|
+
Pindo::XcodeBuildHelper.modify_info_plist(
|
|
586
|
+
project_dir: project_dir,
|
|
587
|
+
proj_name: proj_name,
|
|
588
|
+
config_json: config_json
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
# 6. 修改项目配置
|
|
592
|
+
Pindo::XcodeBuildHelper.modify_project_config(
|
|
593
|
+
project_dir: project_dir,
|
|
594
|
+
proj_name: proj_name,
|
|
595
|
+
config_json: config_json
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
# 7. 修改 AppPrefix.plist
|
|
599
|
+
appprefix_file = "AppPrefix.plist"
|
|
600
|
+
if config_json['project_info'] && config_json['project_info']['appprefix_plist']
|
|
601
|
+
appprefix_file = config_json['project_info']['appprefix_plist']
|
|
602
|
+
end
|
|
603
|
+
config_helper.modify_appprefix_plist(
|
|
604
|
+
project_dir: project_dir,
|
|
605
|
+
appprefix_file: appprefix_file,
|
|
606
|
+
config_json: config_json
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
Funlog.instance.fancyinfo_success("工程配置修改完成!")
|
|
610
|
+
|
|
611
|
+
# 8. 检查 Swark 授权
|
|
612
|
+
deploy_identifier = config_json['app_info']['app_identifier'] || bundle_id
|
|
613
|
+
Pindo::SwarkHelper.check_swark_authorize(
|
|
614
|
+
config_json: config_json,
|
|
615
|
+
buid_type: 'dev',
|
|
616
|
+
deploy_identifier: deploy_identifier
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
return true
|
|
620
|
+
rescue StandardError => e
|
|
621
|
+
Funlog.instance.fancyinfo_error("配置 Xcode 项目失败: #{e.message}")
|
|
622
|
+
puts e.backtrace
|
|
623
|
+
return false
|
|
624
|
+
end
|
|
625
|
+
|
|
491
626
|
end
|
|
492
627
|
|
|
493
628
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'fileutils'
|
|
2
2
|
require 'xcodeproj'
|
|
3
3
|
require 'json'
|
|
4
|
-
require 'pindo/module/cert/xcodecerthelper'
|
|
5
4
|
|
|
6
5
|
module Pindo
|
|
7
6
|
|
|
@@ -114,6 +113,25 @@ module Pindo
|
|
|
114
113
|
end
|
|
115
114
|
end
|
|
116
115
|
|
|
116
|
+
# 获取 Target 名称映射
|
|
117
|
+
def get_target_name_map
|
|
118
|
+
return {
|
|
119
|
+
"MainTarget" => "bundle_id",
|
|
120
|
+
"Content" => "bundle_id_pushcontent",
|
|
121
|
+
"Service" => "bundle_id_pushservice",
|
|
122
|
+
"Keyboard" => "bundle_id_keyboard",
|
|
123
|
+
"iMessage" => "bundle_id_imessage",
|
|
124
|
+
"Siri" => "bundle_id_siri",
|
|
125
|
+
"SiriUI" => "bundle_id_siriui",
|
|
126
|
+
"Widget" => "bundle_id_widget",
|
|
127
|
+
"Extension" => "bundle_id_extension",
|
|
128
|
+
"ExtensionAd" => "bundle_id_extensionad",
|
|
129
|
+
"ExtensionPorn" => "bundle_id_extensionporn",
|
|
130
|
+
"WatchApp" => "bundle_id_watchapp",
|
|
131
|
+
"WatchAppComplication" => "bundle_id_watchapp_extension"
|
|
132
|
+
}
|
|
133
|
+
end
|
|
134
|
+
|
|
117
135
|
def modify_project_config(project_dir:nil, proj_name:nil, config_json:nil)
|
|
118
136
|
|
|
119
137
|
proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
|
|
@@ -419,6 +437,138 @@ module Pindo
|
|
|
419
437
|
end
|
|
420
438
|
end
|
|
421
439
|
|
|
440
|
+
# 构建 Xcode 工程的主入口方法
|
|
441
|
+
# @param project_dir [String] 工程目录
|
|
442
|
+
# @param icloud_id [String, nil] iCloud ID(可选)
|
|
443
|
+
# @return [String, nil] 生成的 IPA 文件路径,失败返回 nil
|
|
444
|
+
def build_project(project_dir:, icloud_id: nil)
|
|
445
|
+
project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
446
|
+
|
|
447
|
+
if project_fullname.nil?
|
|
448
|
+
puts "未找到 Xcode 工程文件"
|
|
449
|
+
return nil
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# 修复 Xcode 16 链接器兼容性问题
|
|
453
|
+
fix_xcode16_linker_flags(project_dir: project_dir)
|
|
454
|
+
|
|
455
|
+
# 清理旧的 build 目录
|
|
456
|
+
build_dir = File.join(project_dir, "build")
|
|
457
|
+
FileUtils.rm_rf(build_dir) if File.exist?(build_dir)
|
|
458
|
+
|
|
459
|
+
# 获取构建参数
|
|
460
|
+
gym_options = get_gym_build_options(
|
|
461
|
+
project_fullname: project_fullname,
|
|
462
|
+
icloud_id: icloud_id
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# 执行构建
|
|
466
|
+
require 'gym'
|
|
467
|
+
config = FastlaneCore::Configuration.create(Gym::Options.available_options, gym_options)
|
|
468
|
+
Gym::Manager.new.work(config)
|
|
469
|
+
|
|
470
|
+
# 查找生成的 IPA 文件
|
|
471
|
+
build_path = File.join(project_dir, "build", "*.ipa")
|
|
472
|
+
ipa_file = Dir.glob(build_path).max_by { |f| File.mtime(f) }
|
|
473
|
+
|
|
474
|
+
ipa_file
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
# 获取 Gym 构建参数
|
|
478
|
+
# @param project_fullname [String] 工程文件完整路径
|
|
479
|
+
# @param icloud_id [String, nil] iCloud ID(可选)
|
|
480
|
+
# @return [Hash] Gym 构建参数
|
|
481
|
+
def get_gym_build_options(project_fullname:, icloud_id: nil)
|
|
482
|
+
if project_fullname.nil?
|
|
483
|
+
raise "请指定要编译的工程"
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
project_path = File.dirname(project_fullname)
|
|
487
|
+
proj_name = File.basename(project_fullname, ".xcodeproj")
|
|
488
|
+
project_obj = Xcodeproj::Project.open(project_fullname)
|
|
489
|
+
|
|
490
|
+
project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
|
|
491
|
+
main_target = project_obj.targets.select { |target| target.product_type.include?(Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]) }.first
|
|
492
|
+
provisioning_profile_name = main_target.build_configurations.first.build_settings['PROVISIONING_PROFILE_SPECIFIER'].downcase.split(" ")
|
|
493
|
+
|
|
494
|
+
# 确定构建类型和 iCloud 环境
|
|
495
|
+
build_type = "app-store"
|
|
496
|
+
icloud_env = "Production"
|
|
497
|
+
|
|
498
|
+
if !project_build_platform.nil? && project_build_platform.eql?("macosx")
|
|
499
|
+
# macOS 平台
|
|
500
|
+
if provisioning_profile_name.include?("development")
|
|
501
|
+
build_type = "development"
|
|
502
|
+
icloud_env = "Development"
|
|
503
|
+
elsif provisioning_profile_name.include?("appstore")
|
|
504
|
+
build_type = "mac-application"
|
|
505
|
+
icloud_env = "Production"
|
|
506
|
+
else
|
|
507
|
+
build_type = "developer-id"
|
|
508
|
+
icloud_env = "Production"
|
|
509
|
+
end
|
|
510
|
+
else
|
|
511
|
+
# iOS 平台
|
|
512
|
+
if provisioning_profile_name.include?("adhoc")
|
|
513
|
+
build_type = "ad-hoc"
|
|
514
|
+
icloud_env = "Development"
|
|
515
|
+
elsif provisioning_profile_name.include?("development")
|
|
516
|
+
build_type = "development"
|
|
517
|
+
icloud_env = "Development"
|
|
518
|
+
else
|
|
519
|
+
build_type = "app-store"
|
|
520
|
+
icloud_env = "Production"
|
|
521
|
+
end
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
# 检查 Unity 测试模板
|
|
525
|
+
if build_type.eql?("app-store") || build_type.eql?("ad-hoc")
|
|
526
|
+
if File.exist?(File.join(project_path, "Unity/Data/Raw/SettingsPluginFlag.txt"))
|
|
527
|
+
raise Informative, "Unity代码包含测试模板,请重新导出Unity代码"
|
|
528
|
+
end
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
# 获取应用名称
|
|
532
|
+
app_ipaname_temp = main_target.build_configurations.first.build_settings['INFOPLIST_KEY_CFBundleDisplayName'] || main_target.display_name
|
|
533
|
+
app_ipaname_temp = app_ipaname_temp.gsub(/ /, '')
|
|
534
|
+
app_ipaname_temp = app_ipaname_temp.gsub(/\'/, '')
|
|
535
|
+
|
|
536
|
+
# 构建基本参数
|
|
537
|
+
values = {
|
|
538
|
+
project: "#{proj_name}.xcodeproj",
|
|
539
|
+
scheme: "#{proj_name}",
|
|
540
|
+
configuration: "Release",
|
|
541
|
+
clean: true,
|
|
542
|
+
export_method: build_type,
|
|
543
|
+
output_directory: "./build/",
|
|
544
|
+
output_name: "#{app_ipaname_temp}.ipa"
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
# macOS 平台特殊处理
|
|
548
|
+
if !project_build_platform.nil? && project_build_platform.eql?("macosx")
|
|
549
|
+
values[:output_name] = nil
|
|
550
|
+
values[:destination] = "generic/platform=macosx"
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
# 如果使用 CocoaPods
|
|
554
|
+
if File.exist?(File.join(project_path, "Podfile"))
|
|
555
|
+
values[:workspace] = "#{proj_name}.xcworkspace"
|
|
556
|
+
values[:project] = nil
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
# 导出选项
|
|
560
|
+
values[:export_options] ||= {}
|
|
561
|
+
values[:export_options][:compileBitcode] = false
|
|
562
|
+
values[:export_options][:stripSwiftSymbols] = true
|
|
563
|
+
values[:export_options][:uploadSymbols] = false
|
|
564
|
+
|
|
565
|
+
if !icloud_id.nil?
|
|
566
|
+
values[:export_options][:iCloudContainerEnvironment] = icloud_env
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
values
|
|
570
|
+
end
|
|
571
|
+
|
|
422
572
|
end
|
|
423
573
|
end
|
|
424
574
|
|