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,105 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'pindo/options/options'
|
|
3
|
+
require 'pindo/config/build_info_manager'
|
|
4
|
+
|
|
5
|
+
module Pindo
|
|
6
|
+
class Command
|
|
7
|
+
class Appstore < Command
|
|
8
|
+
|
|
9
|
+
class Initconfig < Appstore
|
|
10
|
+
|
|
11
|
+
# 命令的简要说明 - 创建应用配置仓库
|
|
12
|
+
self.summary = '创建应用配置仓库(在Gitee上创建并初始化)'
|
|
13
|
+
|
|
14
|
+
# 命令的详细说明,包含用法示例
|
|
15
|
+
self.description = <<-DESC
|
|
16
|
+
在Gitee上创建新的应用配置仓库,并从模板仓库复制配置文件结构。
|
|
17
|
+
|
|
18
|
+
支持功能:
|
|
19
|
+
|
|
20
|
+
* 在Gitee上创建新的应用配置仓库
|
|
21
|
+
|
|
22
|
+
* 从模板仓库复制配置文件结构
|
|
23
|
+
|
|
24
|
+
* 支持测试环境和生产环境仓库创建
|
|
25
|
+
|
|
26
|
+
* 自动替换配置文件中的Bundle ID
|
|
27
|
+
|
|
28
|
+
* 支持位置参数(向后兼容)和选项参数两种格式
|
|
29
|
+
|
|
30
|
+
使用示例:
|
|
31
|
+
|
|
32
|
+
$ pindo appstore initconfig com.example.app # 位置参数(向后兼容)
|
|
33
|
+
|
|
34
|
+
$ pindo appstore initconfig --bundleid=com.example.app # 选项参数
|
|
35
|
+
|
|
36
|
+
$ pindo appstore initconfig com.example.app --test # 创建测试环境仓库
|
|
37
|
+
|
|
38
|
+
$ pindo appstore initconfig --bundleid=com.example.app --test # 选项参数 + 测试环境
|
|
39
|
+
|
|
40
|
+
$ pindo appstore initconfig # 交互式输入Bundle ID
|
|
41
|
+
|
|
42
|
+
$ PINDO_BUNDLE_ID=com.example.app pindo appstore initconfig # 使用环境变量
|
|
43
|
+
DESC
|
|
44
|
+
|
|
45
|
+
# 定义位置参数(向后兼容)
|
|
46
|
+
self.arguments = [
|
|
47
|
+
CLAide::Argument.new('bundleid', true)
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
# 定义此命令使用的参数项
|
|
51
|
+
def self.option_items
|
|
52
|
+
@option_items ||= Pindo::Options::BuildOptions.select(:bundleid)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# 命令的选项列表
|
|
56
|
+
def self.options
|
|
57
|
+
[
|
|
58
|
+
['--test', '创建测试环境仓库']
|
|
59
|
+
].concat(option_items.map { |item| item.to_claide_option }).concat(super)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def initialize(argv)
|
|
63
|
+
# 首先获取位置参数(向后兼容)
|
|
64
|
+
positional_bundleid = argv.shift_argument
|
|
65
|
+
|
|
66
|
+
# 获取 test 标志
|
|
67
|
+
@test_flag = argv.flag?('test', false)
|
|
68
|
+
|
|
69
|
+
# 使用 Options 模块初始化参数
|
|
70
|
+
@options = initialize_options(argv)
|
|
71
|
+
|
|
72
|
+
# 优先使用选项参数,如果没有则使用位置参数
|
|
73
|
+
@bundle_id = @options[:bundleid] || positional_bundleid
|
|
74
|
+
|
|
75
|
+
super
|
|
76
|
+
@additional_args = argv.remainder!
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def validate!
|
|
80
|
+
super
|
|
81
|
+
|
|
82
|
+
# 如果没有提供 bundleid,提示用户输入
|
|
83
|
+
if @bundle_id.nil? || @bundle_id.empty?
|
|
84
|
+
require 'highline/import'
|
|
85
|
+
cli = HighLine.new
|
|
86
|
+
say "需要输入仓库名称,默认以 Bundle ID 作为仓库名称"
|
|
87
|
+
@bundle_id = cli.ask('请输入 Bundle ID: ')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
help! '需要提供 Bundle ID' if @bundle_id.nil? || @bundle_id.empty?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def run
|
|
94
|
+
# 使用 BuildInfoManager 创建配置仓库
|
|
95
|
+
build_info_manager = Pindo::BuildInfoManager.share_instance
|
|
96
|
+
build_info_manager.create_appconfig_with_bundleid(
|
|
97
|
+
bundle_id: @bundle_id,
|
|
98
|
+
test_flag: @test_flag
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -1,52 +1,134 @@
|
|
|
1
1
|
require 'highline/import'
|
|
2
|
-
require 'xcodeproj'
|
|
3
|
-
require 'find'
|
|
4
2
|
require 'fileutils'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'pindo/options/options'
|
|
5
|
+
require 'pindo/module/appstore/itcapp_helper'
|
|
5
6
|
|
|
6
7
|
module Pindo
|
|
7
8
|
class Command
|
|
8
9
|
class Appstore < Command
|
|
9
10
|
class Itcapp < Appstore
|
|
10
11
|
|
|
12
|
+
# 命令的简要说明 - 在App Store Connect中创建App
|
|
13
|
+
self.summary = '在App Store Connect中创建App'
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
# 命令的详细说明,包含用法示例
|
|
14
16
|
self.description = <<-DESC
|
|
15
|
-
|
|
17
|
+
根据config.json中的配置, 在App Store Connect中创建应用。
|
|
16
18
|
|
|
17
19
|
支持功能:
|
|
18
20
|
|
|
19
21
|
* 在App Store Connect创建新应用
|
|
20
22
|
|
|
23
|
+
* 自动生成SKU ID
|
|
24
|
+
|
|
21
25
|
* 配置应用基本信息
|
|
22
26
|
|
|
23
|
-
*
|
|
27
|
+
* 自动更新config.json中的App ID
|
|
28
|
+
|
|
29
|
+
* 支持位置参数(向后兼容)和选项参数两种格式
|
|
24
30
|
|
|
25
31
|
使用示例:
|
|
26
32
|
|
|
27
|
-
$ pindo appstore itcapp
|
|
33
|
+
$ pindo appstore itcapp # 使用当前目录的config.json
|
|
34
|
+
|
|
35
|
+
$ pindo appstore itcapp config.json # 位置参数(向后兼容)
|
|
36
|
+
|
|
37
|
+
$ pindo appstore itcapp --config=config.json # 选项参数
|
|
28
38
|
|
|
29
|
-
$ pindo appstore itcapp
|
|
39
|
+
$ pindo appstore itcapp --num=1.0.0 # 指定版本号
|
|
40
|
+
|
|
41
|
+
$ pindo appstore itcapp --com="My Company" # 指定公司名称
|
|
42
|
+
|
|
43
|
+
$ pindo appstore itcapp --config=config.json --num=1.0.0 --com="My Company"
|
|
30
44
|
DESC
|
|
31
45
|
|
|
46
|
+
# 定义位置参数(向后兼容)
|
|
32
47
|
self.arguments = [
|
|
33
|
-
CLAide::Argument.new('path/to/config.json',
|
|
48
|
+
CLAide::Argument.new('path/to/config.json', true)
|
|
34
49
|
]
|
|
35
50
|
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
# 定义此命令使用的参数项(类方法,避免重复定义)
|
|
52
|
+
def self.option_items
|
|
53
|
+
@option_items ||= [
|
|
54
|
+
Pindo::Options::OptionItem.new(
|
|
55
|
+
key: :config,
|
|
56
|
+
description: '指定config.json文件路径',
|
|
57
|
+
type: String,
|
|
58
|
+
optional: true,
|
|
59
|
+
example: 'pindo appstore itcapp --config=config.json'
|
|
60
|
+
),
|
|
61
|
+
Pindo::Options::OptionItem.new(
|
|
62
|
+
key: :num,
|
|
63
|
+
description: '指定应用版本号',
|
|
64
|
+
type: String,
|
|
65
|
+
optional: true,
|
|
66
|
+
example: 'pindo appstore itcapp --num=1.0.0'
|
|
67
|
+
),
|
|
68
|
+
Pindo::Options::OptionItem.new(
|
|
69
|
+
key: :com,
|
|
70
|
+
description: '指定公司名称',
|
|
71
|
+
type: String,
|
|
72
|
+
optional: true,
|
|
73
|
+
example: 'pindo appstore itcapp --com="My Company"'
|
|
74
|
+
)
|
|
75
|
+
]
|
|
76
|
+
end
|
|
38
77
|
|
|
39
|
-
|
|
78
|
+
# 命令的选项列表
|
|
79
|
+
def self.options
|
|
80
|
+
# 转换为 CLAide 格式
|
|
81
|
+
option_items.map { |item| item.to_claide_option }.concat(super)
|
|
40
82
|
end
|
|
41
83
|
|
|
42
84
|
def initialize(argv)
|
|
85
|
+
# 首先获取位置参数(向后兼容)
|
|
86
|
+
positional_config = argv.shift_argument
|
|
87
|
+
|
|
88
|
+
# 使用 Options 模块初始化参数
|
|
89
|
+
@options = initialize_options(argv)
|
|
90
|
+
|
|
91
|
+
# 优先使用选项参数,如果没有则使用位置参数,最后默认为当前目录的config.json
|
|
92
|
+
@config_path = @options[:config] || positional_config || File.join(Dir.pwd, 'config.json')
|
|
93
|
+
@app_version = @options[:num]
|
|
94
|
+
@company_name = @options[:com]
|
|
95
|
+
|
|
96
|
+
puts "@app_version = #{@app_version}" if @app_version
|
|
43
97
|
|
|
44
98
|
super
|
|
99
|
+
@additional_args = argv.remainder!
|
|
45
100
|
end
|
|
46
101
|
|
|
102
|
+
def validate!
|
|
103
|
+
super
|
|
47
104
|
|
|
48
|
-
|
|
105
|
+
# 检查 config.json 文件是否存在
|
|
106
|
+
unless File.exist?(@config_path)
|
|
107
|
+
help! "配置文件不存在: #{@config_path}"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# 读取并解析 config.json
|
|
111
|
+
begin
|
|
112
|
+
@config_json = JSON.parse(File.read(@config_path))
|
|
113
|
+
rescue JSON::ParserError => e
|
|
114
|
+
help! "配置文件格式错误: #{e.message}"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
49
117
|
|
|
118
|
+
def run
|
|
119
|
+
# 调用 ItcAppHelper 执行 iTunes Connect App 创建流程
|
|
120
|
+
begin
|
|
121
|
+
Pindo::ItcAppHelper.execute_itcapp_creation(
|
|
122
|
+
config_json: @config_json,
|
|
123
|
+
config_path: @config_path,
|
|
124
|
+
app_version: @app_version,
|
|
125
|
+
company_name: @company_name
|
|
126
|
+
)
|
|
127
|
+
puts "\n✓ iTunes Connect App 创建完成!"
|
|
128
|
+
rescue StandardError => e
|
|
129
|
+
puts "\n❌ iTunes Connect App 创建失败: #{e.message}"
|
|
130
|
+
raise e
|
|
131
|
+
end
|
|
50
132
|
end
|
|
51
133
|
|
|
52
134
|
end
|
|
@@ -4,19 +4,15 @@ require 'find'
|
|
|
4
4
|
require 'fileutils'
|
|
5
5
|
require "fastimage"
|
|
6
6
|
require 'deliver'
|
|
7
|
-
|
|
7
|
+
require 'pindo/config/ios_config_parser'
|
|
8
8
|
|
|
9
9
|
module Pindo
|
|
10
10
|
class Command
|
|
11
|
-
class
|
|
12
|
-
class Itcinfo <
|
|
13
|
-
|
|
14
|
-
include Command::DeployOptions
|
|
11
|
+
class Appstore < Command
|
|
12
|
+
class Itcinfo < Appstore
|
|
15
13
|
|
|
16
|
-
include XcodeCertHelper
|
|
17
14
|
include AppstoreMetadataConnectApiHelper
|
|
18
15
|
|
|
19
|
-
|
|
20
16
|
self.summary = '更新AppStore中的App信息'
|
|
21
17
|
|
|
22
18
|
self.description = <<-DESC
|
|
@@ -28,68 +24,79 @@ module Pindo
|
|
|
28
24
|
- 同步和覆盖现有截图
|
|
29
25
|
|
|
30
26
|
使用示例:
|
|
31
|
-
pindo
|
|
32
|
-
pindo
|
|
33
|
-
pindo
|
|
34
|
-
pindo
|
|
27
|
+
pindo appstore itcinfo --metadata
|
|
28
|
+
pindo appstore itcinfo --screenshots
|
|
29
|
+
pindo appstore itcinfo --metadata --screenshots
|
|
30
|
+
pindo appstore itcinfo --screenshots --overwrite
|
|
35
31
|
DESC
|
|
36
32
|
|
|
37
33
|
self.arguments = [
|
|
38
|
-
CLAide::Argument.new('path/to/config.json', true),
|
|
39
34
|
]
|
|
40
35
|
|
|
41
36
|
def self.options
|
|
42
37
|
[
|
|
43
|
-
['--metadata', '
|
|
44
|
-
['--screenshots', '
|
|
45
|
-
['--overwrite', '
|
|
46
|
-
['--sync', '
|
|
47
|
-
|
|
48
|
-
['--ipa', 'Upload ipa to iTunes Connect.'],
|
|
38
|
+
['--metadata', '上传元数据到iTunes Connect'],
|
|
39
|
+
['--screenshots', '上传截图到iTunes Connect'],
|
|
40
|
+
['--overwrite', '覆盖iTunes Connect中的截图'],
|
|
41
|
+
['--sync', '同步截图到iTunes Connect'],
|
|
42
|
+
['--ipa', '上传ipa到iTunes Connect'],
|
|
49
43
|
].concat(super)
|
|
50
44
|
end
|
|
51
45
|
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
def initialize(argv)
|
|
54
47
|
@upload_metadata_flag = argv.flag?('metadata', false)
|
|
55
48
|
@upload_screenshots_flag = argv.flag?('screenshots', false)
|
|
56
|
-
|
|
57
49
|
@overwrite_flag = argv.flag?('overwrite', false)
|
|
58
50
|
@sync_flag = argv.flag?('sync', false)
|
|
59
|
-
|
|
60
51
|
@upload_ipa_flag = argv.flag?('ipa', false)
|
|
61
52
|
|
|
62
53
|
super
|
|
63
|
-
|
|
64
|
-
|
|
54
|
+
end
|
|
65
55
|
|
|
66
56
|
def run
|
|
67
57
|
current_project_dir = Dir.pwd
|
|
58
|
+
config_file = File.join(current_project_dir, "config.json")
|
|
68
59
|
|
|
69
|
-
|
|
70
|
-
|
|
60
|
+
# 加载配置
|
|
61
|
+
config_parser = Pindo::IosConfigParser.instance
|
|
62
|
+
config_parser.load_config(config_file: config_file)
|
|
63
|
+
@config_json = config_parser.config_json
|
|
64
|
+
@bundle_id = config_parser.bundle_id
|
|
65
|
+
@apple_id = config_parser.apple_id
|
|
71
66
|
|
|
72
|
-
|
|
67
|
+
if @config_json.nil? || @config_json.empty?
|
|
68
|
+
raise Informative, "配置未加载,请检查配置文件: #{config_file}"
|
|
69
|
+
end
|
|
73
70
|
|
|
74
|
-
|
|
71
|
+
if @bundle_id.nil? || @bundle_id.empty?
|
|
72
|
+
raise Informative, "无法从配置文件中获取 Bundle ID"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if @apple_id.nil? || @apple_id.empty?
|
|
76
|
+
raise Informative, "无法从配置文件中获取 Apple ID"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
pindo_dir = File.expand_path(pindo_single_config.pindo_dir)
|
|
80
|
+
@app_config_dir = File.join(pindo_dir, @bundle_id)
|
|
81
|
+
|
|
82
|
+
print_info(project_dir: current_project_dir, apple_id: @apple_id, bundle_id: @bundle_id, config_json: @config_json)
|
|
75
83
|
|
|
76
84
|
if @upload_metadata_flag
|
|
77
85
|
process_itunes_metadata()
|
|
78
|
-
fastlane_login(apple_id
|
|
79
|
-
fastlane_upload_metadata(temp_bundle_id
|
|
86
|
+
fastlane_login(apple_id: @apple_id)
|
|
87
|
+
fastlane_upload_metadata(temp_bundle_id: @bundle_id)
|
|
80
88
|
end
|
|
81
89
|
|
|
82
90
|
if @upload_screenshots_flag
|
|
83
91
|
ENV["FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS"] = "YES"
|
|
84
|
-
app_screenshots_dir = File.join(@app_config_dir,
|
|
85
|
-
fastlane_process_screenshots(app_screenshots_dir:app_screenshots_dir)
|
|
92
|
+
app_screenshots_dir = File.join(@app_config_dir, "fastlane/screenshots")
|
|
93
|
+
fastlane_process_screenshots(app_screenshots_dir: app_screenshots_dir)
|
|
86
94
|
|
|
87
|
-
fastlane_login(apple_id
|
|
88
|
-
fastlane_upload_screenshots(apple_id
|
|
95
|
+
fastlane_login(apple_id: @apple_id)
|
|
96
|
+
fastlane_upload_screenshots(apple_id: @apple_id, bundle_id: @bundle_id, app_screenshots_dir: app_screenshots_dir)
|
|
89
97
|
end
|
|
90
98
|
|
|
91
99
|
if @upload_ipa_flag
|
|
92
|
-
# prepare_screenshots(project_dir:current_project_dir, apple_id:@apple_id, bundle_id:@bundle_id, config_json:@config_json)
|
|
93
100
|
command = "fastlane uploadipa"
|
|
94
101
|
system command
|
|
95
102
|
end
|
|
@@ -97,25 +104,19 @@ module Pindo
|
|
|
97
104
|
puts "Done !!!"
|
|
98
105
|
end
|
|
99
106
|
|
|
100
|
-
def process_itunes_metadata(
|
|
101
|
-
app_itunes_dir = File.join(@app_config_dir,
|
|
102
|
-
app_itunes_file = File.join(app_itunes_dir,
|
|
107
|
+
def process_itunes_metadata()
|
|
108
|
+
app_itunes_dir = File.join(@app_config_dir, "fastlane")
|
|
109
|
+
app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
|
|
103
110
|
app_itunes_json = JSON.parse(File.read(app_itunes_file))
|
|
104
111
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
112
|
app_itunes_json = app_itunes_json || {}
|
|
109
113
|
|
|
110
|
-
|
|
111
|
-
|
|
112
114
|
app_itunes_json["app_info"] = app_itunes_json["app_info"] || {}
|
|
113
115
|
app_itunes_json["app_info"]["app_info_localization"] = app_itunes_json["app_info"]["app_info_localization"] || {}
|
|
114
116
|
|
|
115
|
-
|
|
116
117
|
if !app_itunes_json["app_info"]["app_info_localization"].nil?
|
|
117
|
-
app_itunes_json["app_info"]["app_info_localization"].each do |lang
|
|
118
|
-
check_app_info_localization(lang:lang, localization_json:app_info_localization)
|
|
118
|
+
app_itunes_json["app_info"]["app_info_localization"].each do |lang, app_info_localization|
|
|
119
|
+
check_app_info_localization(lang: lang, localization_json: app_info_localization)
|
|
119
120
|
end
|
|
120
121
|
end
|
|
121
122
|
|
|
@@ -138,43 +139,33 @@ module Pindo
|
|
|
138
139
|
app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] || {}
|
|
139
140
|
app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] || {}
|
|
140
141
|
|
|
141
|
-
|
|
142
|
-
notes_file = File.join(platform_metadata_path, "review_notes.txt")
|
|
142
|
+
notes_file = File.join(platform_metadata_path, "review_notes.txt")
|
|
143
143
|
if File.exist?(notes_file)
|
|
144
|
-
notes_file_txt =
|
|
144
|
+
notes_file_txt = File.read(notes_file)
|
|
145
145
|
app_itunes_json["app_edit_version_info"][platform]["app_review_info"]["notes"] = notes_file_txt.to_s.strip
|
|
146
146
|
end
|
|
147
147
|
|
|
148
|
-
|
|
149
148
|
if !app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].nil?
|
|
150
|
-
app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].each do |lang
|
|
149
|
+
app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].each do |lang, value|
|
|
151
150
|
|
|
152
151
|
app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] || {}
|
|
153
152
|
|
|
154
|
-
lang_metadata_path = File.join(platform_metadata_path,
|
|
153
|
+
lang_metadata_path = File.join(platform_metadata_path, lang)
|
|
155
154
|
if !File.exist?(lang_metadata_path)
|
|
156
155
|
FileUtils.mkdir_p(lang_metadata_path)
|
|
157
156
|
end
|
|
158
157
|
|
|
159
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"description")
|
|
160
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"keywords")
|
|
161
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"support_url")
|
|
162
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"marketing_url")
|
|
163
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"promotional_text")
|
|
164
|
-
read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"whats_new")
|
|
158
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "description")
|
|
159
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "keywords")
|
|
160
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "support_url")
|
|
161
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "marketing_url")
|
|
162
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "promotional_text")
|
|
163
|
+
read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "whats_new")
|
|
165
164
|
end
|
|
166
165
|
end
|
|
167
166
|
|
|
168
167
|
end
|
|
169
168
|
|
|
170
|
-
|
|
171
|
-
#platforms = ["IOS", "MAC_OS", "TV_OS"]
|
|
172
|
-
|
|
173
|
-
# Dir.foreach(app_itunes_dir) do |file|
|
|
174
|
-
# if File::directory?(File.join(app_itunes_dir, file)) && platforms.include?(file)
|
|
175
|
-
# end
|
|
176
|
-
# end
|
|
177
|
-
|
|
178
169
|
File.open(app_itunes_file, "w") do |file|
|
|
179
170
|
file.write(JSON.pretty_generate(app_itunes_json))
|
|
180
171
|
file.close
|
|
@@ -182,9 +173,7 @@ module Pindo
|
|
|
182
173
|
|
|
183
174
|
end
|
|
184
175
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def check_app_info_localization(lang:nil, localization_json:nil)
|
|
176
|
+
def check_app_info_localization(lang: nil, localization_json: nil)
|
|
188
177
|
if !localization_json.nil?
|
|
189
178
|
|
|
190
179
|
localization_json.each do |key, value|
|
|
@@ -193,7 +182,7 @@ module Pindo
|
|
|
193
182
|
localization_json[key] = value.to_s.strip
|
|
194
183
|
end
|
|
195
184
|
|
|
196
|
-
if (
|
|
185
|
+
if (key.eql?("name") || key.eql?("subtitle")) && !localization_json[key].nil? && localization_json[key].length > 30 && localization_json[key].length < 2
|
|
197
186
|
puts
|
|
198
187
|
puts
|
|
199
188
|
puts localization_json[key]
|
|
@@ -205,17 +194,12 @@ module Pindo
|
|
|
205
194
|
|
|
206
195
|
end
|
|
207
196
|
|
|
197
|
+
def read_app_version_info_localization(lang: nil, localization_json: nil, lang_metadata_path: nil, key_name: nil)
|
|
208
198
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
# puts "lang_metadata_path : #{lang_metadata_path}"
|
|
212
|
-
|
|
213
|
-
key_name_file = File.join(lang_metadata_path, key_name + ".txt")
|
|
199
|
+
key_name_file = File.join(lang_metadata_path, key_name + ".txt")
|
|
214
200
|
if File.exist?(key_name_file)
|
|
215
201
|
localization_json = localization_json || {}
|
|
216
|
-
key_name_txt =
|
|
217
|
-
# puts "key_name : #{key_name}"
|
|
218
|
-
# puts "key_name_txt : #{key_name_txt}"
|
|
202
|
+
key_name_txt = File.read(key_name_file)
|
|
219
203
|
localization_json[key_name] = key_name_txt.to_s.strip
|
|
220
204
|
if key_name.eql?("keywords") && !localization_json[key_name].nil? && localization_json[key_name].length > 100
|
|
221
205
|
puts localization_json[key_name]
|
|
@@ -229,23 +213,21 @@ module Pindo
|
|
|
229
213
|
puts "长度: #{localization_json[key_name].length}"
|
|
230
214
|
raise Informative, "#{lang} : description 超出限定的4000个字符 !!!"
|
|
231
215
|
end
|
|
232
|
-
# puts localization_json
|
|
233
216
|
end
|
|
234
217
|
end
|
|
235
218
|
|
|
219
|
+
def fastlane_upload_metadata(temp_bundle_id: nil)
|
|
236
220
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
app_itunes_dir = File.join(@app_config_dir, "fastlane")
|
|
240
|
-
app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
|
|
221
|
+
app_itunes_dir = File.join(@app_config_dir, "fastlane")
|
|
222
|
+
app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
|
|
241
223
|
app_itunes_json = JSON.parse(File.read(app_itunes_file))
|
|
242
224
|
|
|
243
225
|
app = Spaceship::ConnectAPI::App.find(temp_bundle_id)
|
|
244
226
|
|
|
245
|
-
fastlane_update_app_metadata(app: app, app_itunes_json:app_itunes_json)
|
|
227
|
+
fastlane_update_app_metadata(app: app, app_itunes_json: app_itunes_json)
|
|
246
228
|
|
|
247
229
|
if !app_itunes_json["app_info"].nil?
|
|
248
|
-
fastlane_update_app_info_metadata(app: app, app_itunes_json:app_itunes_json)
|
|
230
|
+
fastlane_update_app_info_metadata(app: app, app_itunes_json: app_itunes_json)
|
|
249
231
|
end
|
|
250
232
|
|
|
251
233
|
if !app_itunes_json["app_edit_version_info"].nil?
|
|
@@ -255,24 +237,21 @@ module Pindo
|
|
|
255
237
|
puts "===========正在处理平台: #{platform}"
|
|
256
238
|
app_edit_version_info = app.get_edit_app_store_version(platform: platform)
|
|
257
239
|
|
|
258
|
-
if !app_edit_version_info.nil? && !app_itunes_json["app_edit_version_info"].nil? &&
|
|
240
|
+
if !app_edit_version_info.nil? && !app_itunes_json["app_edit_version_info"].nil? && !app_itunes_json["app_edit_version_info"][platform].nil?
|
|
259
241
|
|
|
260
|
-
fastlane_update_app_version_info_metadata(app: app, platform:platform, app_itunes_json:app_itunes_json)
|
|
242
|
+
fastlane_update_app_version_info_metadata(app: app, platform: platform, app_itunes_json: app_itunes_json)
|
|
261
243
|
end
|
|
262
244
|
|
|
263
245
|
end
|
|
264
246
|
end
|
|
265
247
|
|
|
266
|
-
|
|
267
|
-
fastlane_update_app_info_localizations(app: app, app_itunes_json:app_itunes_json)
|
|
268
|
-
|
|
248
|
+
fastlane_update_app_info_localizations(app: app, app_itunes_json: app_itunes_json)
|
|
269
249
|
|
|
270
250
|
end
|
|
271
251
|
|
|
252
|
+
def print_info(project_dir: nil, apple_id: nil, bundle_id: nil, config_json: nil)
|
|
272
253
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
|
|
254
|
+
pindo_dir = File.expand_path(pindo_single_config.pindo_dir)
|
|
276
255
|
config_repo_dir = File.join(pindo_dir, bundle_id)
|
|
277
256
|
apple_id = @config_json['app_info']['app_id_ios']
|
|
278
257
|
|
|
@@ -296,23 +275,21 @@ module Pindo
|
|
|
296
275
|
|
|
297
276
|
end
|
|
298
277
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
def fastlane_process_screenshots(app_screenshots_dir:nil)
|
|
278
|
+
def fastlane_process_screenshots(app_screenshots_dir: nil)
|
|
302
279
|
|
|
303
280
|
if File.exist?(app_screenshots_dir)
|
|
304
281
|
platforms = ["IOS", "MAC_OS", "TV_OS", "XR_OS"]
|
|
305
|
-
platforms.each do
|
|
306
|
-
platform_screenshots_path = File.join(app_screenshots_dir,
|
|
282
|
+
platforms.each do |platform|
|
|
283
|
+
platform_screenshots_path = File.join(app_screenshots_dir, platform.downcase)
|
|
307
284
|
if File.exist?(platform_screenshots_path)
|
|
308
285
|
Dir.glob(File.join(platform_screenshots_path, "*")).each do |lang_screenshots_path|
|
|
309
|
-
if File.directory?(lang_screenshots_path) && ![".", "..","iMessage", "imessage"].include?(File.basename(lang_screenshots_path))
|
|
310
|
-
fastlane_process_lang_screenshots(lang_screenshots_path:lang_screenshots_path)
|
|
286
|
+
if File.directory?(lang_screenshots_path) && ![".", "..", "iMessage", "imessage"].include?(File.basename(lang_screenshots_path))
|
|
287
|
+
fastlane_process_lang_screenshots(lang_screenshots_path: lang_screenshots_path)
|
|
311
288
|
elsif File.directory?(lang_screenshots_path) && ["iMessage", "imessage", "IMESSAGE"].include?(File.basename(lang_screenshots_path))
|
|
312
289
|
imessage_screenshots_path = lang_screenshots_path
|
|
313
|
-
|
|
290
|
+
Dir.glob(File.join(imessage_screenshots_path, "*")).each do |imessage_lane_screenshots_path|
|
|
314
291
|
if File.directory?(lang_screenshots_path) && ![".", ".."].include?(File.basename(imessage_lane_screenshots_path))
|
|
315
|
-
fastlane_process_lang_screenshots(lang_screenshots_path:imessage_lane_screenshots_path)
|
|
292
|
+
fastlane_process_lang_screenshots(lang_screenshots_path: imessage_lane_screenshots_path)
|
|
316
293
|
end
|
|
317
294
|
end
|
|
318
295
|
end
|
|
@@ -325,52 +302,47 @@ module Pindo
|
|
|
325
302
|
|
|
326
303
|
end
|
|
327
304
|
|
|
328
|
-
|
|
329
|
-
def fastlane_upload_screenshots(apple_id:nil, bundle_id:nil, app_screenshots_dir:nil)
|
|
305
|
+
def fastlane_upload_screenshots(apple_id: nil, bundle_id: nil, app_screenshots_dir: nil)
|
|
330
306
|
|
|
331
307
|
if !File.exist?(app_screenshots_dir)
|
|
332
308
|
return
|
|
333
309
|
end
|
|
334
310
|
|
|
335
|
-
platform_screenshots_path = File.join(app_screenshots_dir,
|
|
311
|
+
platform_screenshots_path = File.join(app_screenshots_dir, "ios")
|
|
336
312
|
|
|
337
313
|
if !File.exist?(platform_screenshots_path)
|
|
338
314
|
puts "!!! Screenshots Path is not exist !!!"
|
|
339
315
|
return
|
|
340
316
|
end
|
|
341
317
|
|
|
342
|
-
app_metadata_dir = File.join(@app_config_dir,
|
|
343
|
-
app_metadata_path = File.join(app_metadata_dir,
|
|
344
|
-
|
|
318
|
+
app_metadata_dir = File.join(@app_config_dir, "fastlane")
|
|
319
|
+
app_metadata_path = File.join(app_metadata_dir, "ios")
|
|
345
320
|
|
|
346
321
|
if @overwrite_flag
|
|
347
322
|
@sync_flag = false
|
|
348
323
|
end
|
|
349
324
|
|
|
350
|
-
|
|
351
325
|
if @sync_flag
|
|
352
326
|
@overwrite_flag = false
|
|
353
327
|
end
|
|
354
328
|
|
|
355
|
-
|
|
356
329
|
values = {
|
|
357
|
-
username:apple_id,
|
|
330
|
+
username: apple_id,
|
|
358
331
|
app_identifier: bundle_id,
|
|
359
332
|
skip_metadata: true,
|
|
360
|
-
skip_binary_upload:true,
|
|
361
|
-
skip_app_version_update:true,
|
|
362
|
-
precheck_include_in_app_purchases:false,
|
|
363
|
-
metadata_path:app_metadata_dir,
|
|
364
|
-
screenshots_path:platform_screenshots_path,
|
|
333
|
+
skip_binary_upload: true,
|
|
334
|
+
skip_app_version_update: true,
|
|
335
|
+
precheck_include_in_app_purchases: false,
|
|
336
|
+
metadata_path: app_metadata_dir,
|
|
337
|
+
screenshots_path: platform_screenshots_path,
|
|
365
338
|
overwrite_screenshots: @overwrite_flag,
|
|
366
|
-
ignore_language_directory_validation:true,
|
|
339
|
+
ignore_language_directory_validation: true,
|
|
367
340
|
sync_screenshots: @sync_flag
|
|
368
341
|
}
|
|
369
342
|
|
|
370
343
|
config = FastlaneCore::Configuration.create(Deliver::Options.available_options, values)
|
|
371
344
|
Deliver::Runner.new(config).run
|
|
372
345
|
|
|
373
|
-
|
|
374
346
|
end
|
|
375
347
|
|
|
376
348
|
end
|