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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3c6d7ad7866c8d8f92e5a817db829bf51daf67408a0876b83687b25826c1fcb
4
- data.tar.gz: 974a6c7c9be87170be834820ead3344e2c59ead93c63d832401ed80412f6353d
3
+ metadata.gz: d4c90bdffcd10aa827054b7aacc7107591c96d6f7c1079f2096592bc5bb0af77
4
+ data.tar.gz: 48d4f04d336c484d76cf1a92fda827b7e9e53608d55786c588f43f85a8752f64
5
5
  SHA512:
6
- metadata.gz: 416e9a546f37f30a966db52da1b4922f75ece53e67b52f33085d3723d543f82abdedeffe025d637fc455d9766e387c0f10d6fd5a9a83e4077c9aff794b235710
7
- data.tar.gz: ac874183dbc82659b9bf653d28e8456edffc8fa61cb42d4abfd9c98a84f516ad3fe5dc7f5130b68dc36734210ac5fbf90d27f35634214e981964221203edfb78
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
- puts "上传文件:"
102
- puts " #{File.basename(@args_nupkg_file)}"
103
- puts " 大小: #{sprintf('%.2f', File.size(@args_nupkg_file) / 1024.0 / 1024.0)} MB"
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
- create_git_tag_from_nuspec(package_dir)
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, package_info)
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, package_info)
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
- puts "━" * 60
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', 'title', 'description', 'releaseNotes', 'readme', 'projectUrl']
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
- <id>#{nuspec_id}</id>
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
- <file src="**" exclude="build/**;.git/**;*.nuspec;*.nupkg" target="content" />
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
- package_info['displayName'] = nuspec_info['title']
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
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.5.5"
9
+ VERSION = "5.5.8"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
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.5.5
4
+ version: 5.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade