pindo 5.5.5 → 5.5.8
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/unity/upload.rb +80 -37
- data/lib/pindo/module/unity/nugethelper.rb +52 -16
- data/lib/pindo/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4c90bdffcd10aa827054b7aacc7107591c96d6f7c1079f2096592bc5bb0af77
|
4
|
+
data.tar.gz: 48d4f04d336c484d76cf1a92fda827b7e9e53608d55786c588f43f85a8752f64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b280d9bcb83416db8499742ab9fc854460fd94125b268e864a7dec64837ceb220bb0d19986718816430ba82497ce980e0a1e515c4ba99c3c3a8562a473f616ef
|
7
|
+
data.tar.gz: a6628594b11ef81be6d762bc00a6ae3a0fa21c126de0b87222d189afd40b61256742d22bd360b8a02d0afac9850b032d8a5e9aa4b084c144caa758d55237e95b
|
@@ -24,7 +24,13 @@ module Pindo
|
|
24
24
|
|
25
25
|
* 指定文件路径上传
|
26
26
|
|
27
|
-
*
|
27
|
+
* 上传前用户确认(可通过环境变量跳过)
|
28
|
+
|
29
|
+
* 自动创建 Git Tag(需要 nuspec 文件)
|
30
|
+
|
31
|
+
环境变量:
|
32
|
+
|
33
|
+
NUGET_UPLOAD_FORCE - 设置此变量跳过上传确认
|
28
34
|
|
29
35
|
使用示例:
|
30
36
|
|
@@ -33,6 +39,8 @@ module Pindo
|
|
33
39
|
$ pindo unity upload path/to/package.nupkg # 指定文件上传
|
34
40
|
|
35
41
|
$ pindo unity upload --nupkg=path/to/file # 使用选项指定
|
42
|
+
|
43
|
+
$ NUGET_UPLOAD_FORCE=1 pindo unity upload # 跳过确认直接上传
|
36
44
|
DESC
|
37
45
|
|
38
46
|
def self.arguments
|
@@ -65,25 +73,16 @@ module Pindo
|
|
65
73
|
def run
|
66
74
|
package_dir = Dir.pwd
|
67
75
|
|
68
|
-
puts "=" * 60
|
69
|
-
puts "🚀 上传到 JPS Nuget 项目"
|
70
|
-
puts "=" * 60
|
71
76
|
puts
|
77
|
+
puts "🚀 上传 Unity Package 到 JPS"
|
78
|
+
puts "━" * 40
|
72
79
|
|
73
80
|
# 如果没有指定文件或文件不存在,则查找
|
74
81
|
if @args_nupkg_file.nil? || !File.exist?(@args_nupkg_file)
|
75
82
|
# 在当前目录查找 .nupkg 文件
|
76
83
|
@args_nupkg_file = Pindo::Unity::NugetHelper.find_nupkg_file(package_dir)
|
77
84
|
|
78
|
-
#
|
79
|
-
if !@args_nupkg_file.nil?
|
80
|
-
answer = agree("需要上传的文件是: #{@args_nupkg_file} ?(Y/n)")
|
81
|
-
if !answer
|
82
|
-
@args_nupkg_file = nil
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# 如果还是没有文件,让用户手动输入
|
85
|
+
# 如果没有找到文件,让用户手动输入
|
87
86
|
if @args_nupkg_file.nil? || !File.exist?(@args_nupkg_file)
|
88
87
|
@args_nupkg_file = ask('需要上传的文件:') || nil
|
89
88
|
if @args_nupkg_file
|
@@ -97,28 +96,57 @@ module Pindo
|
|
97
96
|
raise Informative, "未找到 .nupkg 文件"
|
98
97
|
end
|
99
98
|
|
99
|
+
# 从 nuspec 文件或 package.json 获取包信息
|
100
|
+
package_info = get_package_info_for_upload(package_dir) rescue nil
|
101
|
+
|
102
|
+
# 显示包信息并一次性确认
|
100
103
|
puts
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
+
if package_info && !package_info.empty?
|
105
|
+
puts "📦 包信息:"
|
106
|
+
puts
|
107
|
+
puts " 名称: #{package_info['displayName']}"
|
108
|
+
puts " ID: #{package_info['name']}"
|
109
|
+
puts " 版本: #{package_info['version']}"
|
110
|
+
puts " 文件: #{@args_nupkg_file}"
|
111
|
+
puts " 大小: #{sprintf('%.2f', File.size(@args_nupkg_file) / 1024.0 / 1024.0)} MB"
|
112
|
+
else
|
113
|
+
puts "📦 上传文件:"
|
114
|
+
puts
|
115
|
+
puts " 文件: #{@args_nupkg_file}"
|
116
|
+
puts " 大小: #{sprintf('%.2f', File.size(@args_nupkg_file) / 1024.0 / 1024.0)} MB"
|
117
|
+
end
|
104
118
|
puts
|
105
119
|
|
120
|
+
# 检查是否设置了强制上传环境变量
|
121
|
+
force_upload = ENV['NUGET_UPLOAD_FORCE']
|
122
|
+
|
123
|
+
if force_upload && !force_upload.empty?
|
124
|
+
puts "🚀 检测到 NUGET_UPLOAD_FORCE 环境变量,跳过确认直接上传..."
|
125
|
+
else
|
126
|
+
# 一次性确认
|
127
|
+
answer = agree("确认上传?(Y/n)")
|
128
|
+
unless answer
|
129
|
+
puts "已取消上传"
|
130
|
+
return
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
106
134
|
# 上传到 JPS
|
107
|
-
upload_to_jps_nuget(@args_nupkg_file)
|
135
|
+
upload_to_jps_nuget(@args_nupkg_file, package_info)
|
108
136
|
|
109
137
|
puts
|
110
|
-
puts "=" * 60
|
111
138
|
puts "✅ 上传完成!"
|
112
|
-
puts "=" * 60
|
113
139
|
puts
|
114
140
|
|
115
|
-
# 上传成功后自动打 tag
|
116
|
-
|
141
|
+
# 上传成功后自动打 tag(仅在有包信息时)
|
142
|
+
if package_info && !package_info.empty?
|
143
|
+
create_git_tag_from_nuspec(package_dir)
|
144
|
+
end
|
117
145
|
end
|
118
146
|
|
119
147
|
private
|
120
148
|
|
121
|
-
def upload_to_jps_nuget(nupkg_file)
|
149
|
+
def upload_to_jps_nuget(nupkg_file, package_info)
|
122
150
|
# 1. 登录 JPS
|
123
151
|
config_file = File.join(
|
124
152
|
Pindoconfig.instance.pindo_common_configdir,
|
@@ -160,9 +188,6 @@ module Pindo
|
|
160
188
|
# 4. 提交到 JPS 项目
|
161
189
|
puts "📋 提交到 JPS 项目..."
|
162
190
|
|
163
|
-
# 读取 package.json 获取包信息
|
164
|
-
package_info = JSON.parse(File.read(File.join(Dir.pwd, "package.json")))
|
165
|
-
|
166
191
|
result = jps_client.upload_project_package(
|
167
192
|
projectId: nuget_project['id'],
|
168
193
|
params: {
|
@@ -173,7 +198,7 @@ module Pindo
|
|
173
198
|
|
174
199
|
if result && result['code'] == 200
|
175
200
|
puts "✅ 提交成功"
|
176
|
-
print_upload_result(result
|
201
|
+
print_upload_result(result)
|
177
202
|
else
|
178
203
|
error_msg = result['message'] || result['msg'] || '未知错误'
|
179
204
|
raise Informative, "提交失败: #{error_msg}"
|
@@ -214,20 +239,38 @@ module Pindo
|
|
214
239
|
nuget_project
|
215
240
|
end
|
216
241
|
|
217
|
-
def print_upload_result(result
|
218
|
-
puts
|
219
|
-
puts "━" * 60
|
220
|
-
puts "📦 上传信息"
|
221
|
-
puts "━" * 60
|
222
|
-
puts "包名称: #{package_info['displayName']}"
|
223
|
-
puts "包ID: #{package_info['name']}"
|
224
|
-
puts "版本: #{package_info['version']}"
|
225
|
-
|
242
|
+
def print_upload_result(result)
|
226
243
|
if result['data'] && result['data']['id']
|
227
|
-
puts "JPS ID: #{result['data']['id']}"
|
244
|
+
puts " JPS ID: #{result['data']['id']}"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def get_package_info_for_upload(package_dir)
|
249
|
+
# 优先尝试从 nuspec 文件读取
|
250
|
+
nuspec_file = Pindo::Unity::NugetHelper.find_nuspec_file(package_dir)
|
251
|
+
|
252
|
+
if nuspec_file && File.exist?(nuspec_file)
|
253
|
+
nuspec_info = Pindo::Unity::NugetHelper.parse_nuspec(nuspec_file)
|
254
|
+
|
255
|
+
# 转换为统一的格式(与 package.json 兼容)
|
256
|
+
# 注意:保持 nuspec 中 ID 的原始格式(驼峰)
|
257
|
+
return {
|
258
|
+
'name' => nuspec_info['id'], # 保持原始的驼峰格式
|
259
|
+
'version' => nuspec_info['version'],
|
260
|
+
'displayName' => nuspec_info['title'] || nuspec_info['id'],
|
261
|
+
'description' => nuspec_info['description']
|
262
|
+
}
|
263
|
+
end
|
264
|
+
|
265
|
+
# 如果没有 nuspec 文件,尝试从 package.json 读取
|
266
|
+
package_json_path = File.join(package_dir, "package.json")
|
267
|
+
|
268
|
+
if File.exist?(package_json_path)
|
269
|
+
return JSON.parse(File.read(package_json_path))
|
228
270
|
end
|
229
271
|
|
230
|
-
|
272
|
+
# 如果都没有,抛出错误
|
273
|
+
raise Informative, "未找到 .nuspec 或 package.json 文件,无法获取包信息"
|
231
274
|
end
|
232
275
|
|
233
276
|
def create_git_tag_from_nuspec(package_dir)
|
@@ -76,6 +76,15 @@ module Pindo
|
|
76
76
|
package_info['name'] = to_lowercase_id(package_info['name'])
|
77
77
|
update_package_json_name(package_dir, package_info['name'])
|
78
78
|
|
79
|
+
# 检查 README.md 是否存在
|
80
|
+
readme_path = File.join(package_dir, "README.md")
|
81
|
+
unless File.exist?(readme_path)
|
82
|
+
puts "⚠️ 警告: 未找到 README.md 文件"
|
83
|
+
puts " README.md 是 NuGet 包的必需文件"
|
84
|
+
puts " 请创建 README.md 文件后再运行此命令"
|
85
|
+
puts
|
86
|
+
end
|
87
|
+
|
79
88
|
nuspec_path = File.join(package_dir, "#{package_info['displayName']}.nuspec")
|
80
89
|
|
81
90
|
# 生成 .nuspec,ID 使用驼峰格式
|
@@ -85,6 +94,11 @@ module Pindo
|
|
85
94
|
puts "✅ 根据 package.json 创建了 #{package_info['displayName']}.nuspec"
|
86
95
|
puts " package.json name: #{package_info['name']} (全小写)"
|
87
96
|
puts " .nuspec id: #{nuspec_id} (驼峰)"
|
97
|
+
|
98
|
+
unless File.exist?(readme_path)
|
99
|
+
puts
|
100
|
+
puts "⚠️ 重要提示: 打包前请确保创建 README.md 文件!"
|
101
|
+
end
|
88
102
|
end
|
89
103
|
|
90
104
|
# 情况B:只有 .nuspec,创建 package.json
|
@@ -191,8 +205,8 @@ module Pindo
|
|
191
205
|
conflicts << "版本不一致: package.json(#{package_info['version']}) vs .nuspec(#{nuspec_info['version']})"
|
192
206
|
end
|
193
207
|
|
194
|
-
# displayName/title
|
195
|
-
if package_info['displayName'] != nuspec_info['title']
|
208
|
+
# displayName/title 对比(title 是可选字段)
|
209
|
+
if nuspec_info['title'] && package_info['displayName'] != nuspec_info['title']
|
196
210
|
conflicts << "标题不一致: package.json displayName(#{package_info['displayName']}) vs .nuspec title(#{nuspec_info['title']})"
|
197
211
|
end
|
198
212
|
|
@@ -218,7 +232,7 @@ module Pindo
|
|
218
232
|
|
219
233
|
# 验证 .nuspec
|
220
234
|
def self.validate_nuspec(nuspec_info)
|
221
|
-
required_fields = ['id', 'version', '
|
235
|
+
required_fields = ['id', 'version', 'description', 'releaseNotes', 'readme', 'projectUrl']
|
222
236
|
missing = required_fields.select { |field| nuspec_info[field].nil? || nuspec_info[field].empty? }
|
223
237
|
|
224
238
|
unless missing.empty?
|
@@ -245,23 +259,44 @@ module Pindo
|
|
245
259
|
description = package_info['description'] || package_info['displayName'] || 'Unity Package'
|
246
260
|
release_notes = package_info['releaseNotes'] || package_info['changelogUrl'] || 'No release notes'
|
247
261
|
|
262
|
+
# 构建基础的 metadata 内容
|
263
|
+
metadata_content = []
|
264
|
+
metadata_content << " <id>#{nuspec_id}</id>"
|
265
|
+
metadata_content << " <version>#{package_info['version']}</version>"
|
266
|
+
# title 是可选字段,只有 displayName 存在时才添加
|
267
|
+
if package_info['displayName'] && !package_info['displayName'].empty?
|
268
|
+
metadata_content << " <title>#{package_info['displayName']}</title>"
|
269
|
+
end
|
270
|
+
metadata_content << " <authors>#{package_info['author'] || 'Unity Package'}</authors>"
|
271
|
+
metadata_content << " <requireLicenseAcceptance>false</requireLicenseAcceptance>"
|
272
|
+
metadata_content << " <license type=\"expression\">MIT</license>"
|
273
|
+
metadata_content << " <projectUrl>#{project_url}</projectUrl>"
|
274
|
+
metadata_content << " <description>#{description}</description>"
|
275
|
+
metadata_content << " <releaseNotes>#{release_notes}</releaseNotes>"
|
276
|
+
|
277
|
+
# README.md 是必需的,总是添加 readme 标签
|
278
|
+
metadata_content << " <readme>README.md</readme>"
|
279
|
+
|
280
|
+
# 检查 README.md 是否存在,用于 files 部分的处理
|
281
|
+
readme_path = File.join(File.dirname(nuspec_path), "README.md")
|
282
|
+
|
283
|
+
# 构建 files 部分,如果有 README.md 需要特殊处理
|
284
|
+
files_content = []
|
285
|
+
if File.exist?(readme_path)
|
286
|
+
files_content << ' <file src="README.md" target="" />'
|
287
|
+
files_content << ' <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg;README.md" target="content" />'
|
288
|
+
else
|
289
|
+
files_content << ' <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg" target="content" />'
|
290
|
+
end
|
291
|
+
|
248
292
|
nuspec_content = <<~XML
|
249
293
|
<?xml version="1.0" encoding="utf-8"?>
|
250
294
|
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
|
251
295
|
<metadata>
|
252
|
-
|
253
|
-
<version>#{package_info['version']}</version>
|
254
|
-
<title>#{package_info['displayName']}</title>
|
255
|
-
<authors>#{package_info['author'] || 'Unity Package'}</authors>
|
256
|
-
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
257
|
-
<license type="expression">MIT</license>
|
258
|
-
<projectUrl>#{project_url}</projectUrl>
|
259
|
-
<description>#{description}</description>
|
260
|
-
<releaseNotes>#{release_notes}</releaseNotes>
|
261
|
-
<readme>README.md</readme>
|
296
|
+
#{metadata_content.join("\n")}
|
262
297
|
</metadata>
|
263
298
|
<files>
|
264
|
-
|
299
|
+
#{files_content.join("\n")}
|
265
300
|
</files>
|
266
301
|
</package>
|
267
302
|
XML
|
@@ -274,7 +309,7 @@ module Pindo
|
|
274
309
|
package_content = {
|
275
310
|
"name" => package_json_name,
|
276
311
|
"version" => nuspec_info['version'],
|
277
|
-
"displayName" => nuspec_info['title'],
|
312
|
+
"displayName" => nuspec_info['title'] || package_json_name, # 如果没有 title,使用 name 作为 displayName
|
278
313
|
"description" => nuspec_info['description'],
|
279
314
|
"unity" => "2020.3",
|
280
315
|
"releaseNotes" => nuspec_info['releaseNotes']
|
@@ -301,7 +336,8 @@ module Pindo
|
|
301
336
|
# 更新关键字段
|
302
337
|
package_info['name'] = to_lowercase_id(nuspec_info['id'])
|
303
338
|
package_info['version'] = nuspec_info['version']
|
304
|
-
|
339
|
+
# 如果 nuspec 有 title 字段才更新,否则保留原有的 displayName
|
340
|
+
package_info['displayName'] = nuspec_info['title'] if nuspec_info['title']
|
305
341
|
package_info['description'] = nuspec_info['description']
|
306
342
|
package_info['releaseNotes'] = nuspec_info['releaseNotes']
|
307
343
|
|
data/lib/pindo/version.rb
CHANGED