pindo 5.5.8 → 5.6.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/pindocontext.rb +14 -5
- data/lib/pindo/command/android/autobuild.rb +17 -21
- data/lib/pindo/command/android/build.rb +4 -4
- data/lib/pindo/command/android/debug.rb +7 -7
- data/lib/pindo/command/dev/autobuild.rb +1 -1
- data/lib/pindo/command/dev/build.rb +1 -1
- data/lib/pindo/command/ios/autobuild.rb +20 -23
- data/lib/pindo/command/ios/build.rb +1 -1
- data/lib/pindo/command/unity/apk.rb +18 -21
- data/lib/pindo/command/unity/ipa.rb +21 -16
- data/lib/pindo/command/web/autobuild.rb +1 -1
- data/lib/pindo/command.rb +10 -2
- data/lib/pindo/module/android/apk_helper.rb +6 -0
- data/lib/pindo/module/android/gradle_helper.rb +259 -202
- data/lib/pindo/module/appselect.rb +12 -0
- data/lib/pindo/module/build/buildhelper.rb +54 -0
- data/lib/pindo/module/build/unityhelper.rb +81 -1
- data/lib/pindo/module/pgyer/pgyerhelper.rb +27 -11
- data/lib/pindo/version.rb +1 -1
- metadata +6 -6
@@ -264,88 +264,53 @@ module Pindo
|
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
267
|
-
#
|
267
|
+
# 改进的生成gradle-wrapper.jar逻辑(带缓存和内置文件回退)
|
268
268
|
def download_gradle_wrapper_jar(wrapper_dir, gradle_version)
|
269
269
|
wrapper_jar_path = File.join(wrapper_dir, "gradle-wrapper.jar")
|
270
270
|
|
271
|
-
#
|
272
|
-
if File.exist?(wrapper_jar_path) &&
|
273
|
-
puts "\e[32m✓ gradle-wrapper.jar
|
271
|
+
# 1. 检查现有文件是否有效
|
272
|
+
if File.exist?(wrapper_jar_path) && verify_gradle_wrapper_jar_complete(wrapper_jar_path, gradle_version)
|
273
|
+
puts "\e[32m✓ gradle-wrapper.jar已存在且验证通过\e[0m"
|
274
274
|
return true
|
275
275
|
end
|
276
276
|
|
277
277
|
puts "正在生成gradle-wrapper.jar (版本: #{gradle_version})..."
|
278
278
|
|
279
|
-
#
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
puts "发现gradlew脚本,使用gradle wrapper命令生成..."
|
287
|
-
return generate_wrapper_with_gradlew(project_path, gradle_version)
|
288
|
-
else
|
289
|
-
puts "未发现gradlew脚本,使用gradle命令生成..."
|
290
|
-
return generate_wrapper_with_gradle(project_path, gradle_version)
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
# 使用gradlew脚本生成wrapper
|
295
|
-
def generate_wrapper_with_gradlew(project_path, gradle_version)
|
296
|
-
puts "使用gradlew脚本生成wrapper..."
|
297
|
-
|
298
|
-
# 切换到项目目录
|
299
|
-
Dir.chdir(project_path) do
|
300
|
-
# 使用gradlew wrapper命令生成wrapper
|
301
|
-
cmd = "./gradlew wrapper --gradle-version #{gradle_version}"
|
302
|
-
puts "执行命令: #{cmd}"
|
303
|
-
|
304
|
-
result = system(cmd)
|
305
|
-
if result
|
306
|
-
puts "\e[32m✓ gradle wrapper生成成功\e[0m"
|
279
|
+
# 2. 尝试使用缓存
|
280
|
+
cached_jar = get_cached_gradle_wrapper_jar(gradle_version)
|
281
|
+
if cached_jar
|
282
|
+
FileUtils.cp(cached_jar, wrapper_jar_path)
|
283
|
+
# 验证缓存文件
|
284
|
+
if verify_gradle_wrapper_jar_complete(wrapper_jar_path, gradle_version)
|
285
|
+
puts "\e[32m✓ 从缓存复制 gradle-wrapper.jar 成功\e[0m"
|
307
286
|
return true
|
308
287
|
else
|
309
|
-
puts "\e[
|
310
|
-
return false
|
288
|
+
puts "\e[33m⚠ 缓存文件验证失败,继续下载\e[0m"
|
311
289
|
end
|
312
290
|
end
|
313
|
-
rescue => e
|
314
|
-
puts "\e[31m✗ gradle wrapper生成异常: #{e.message}\e[0m"
|
315
|
-
false
|
316
|
-
end
|
317
|
-
|
318
|
-
# 使用gradle命令生成wrapper
|
319
|
-
def generate_wrapper_with_gradle(project_path, gradle_version)
|
320
|
-
puts "使用gradle命令生成wrapper..."
|
321
|
-
|
322
|
-
# 检查系统是否有gradle命令
|
323
|
-
unless system("which gradle > /dev/null 2>&1")
|
324
|
-
puts "\e[33m⚠ 系统未安装gradle,使用简化的wrapper生成方式...\e[0m"
|
325
|
-
return generate_wrapper_manually(project_path, gradle_version)
|
326
|
-
end
|
327
291
|
|
328
|
-
#
|
329
|
-
|
330
|
-
#
|
331
|
-
|
332
|
-
puts "执行命令: #{cmd}"
|
333
|
-
|
334
|
-
result = system(cmd)
|
335
|
-
if result
|
336
|
-
puts "\e[32m✓ gradle wrapper生成成功\e[0m"
|
292
|
+
# 3. 尝试下载
|
293
|
+
if download_standard_wrapper_jar(wrapper_jar_path, gradle_version)
|
294
|
+
# 验证下载的文件
|
295
|
+
if verify_gradle_wrapper_jar_complete(wrapper_jar_path, gradle_version)
|
337
296
|
return true
|
338
297
|
else
|
339
|
-
puts "\e[
|
340
|
-
return false
|
298
|
+
puts "\e[33m⚠ 下载文件验证失败,使用内置文件\e[0m"
|
341
299
|
end
|
342
300
|
end
|
343
|
-
|
344
|
-
|
301
|
+
|
302
|
+
# 4. 最后回退:使用内置文件
|
303
|
+
puts "\e[33m⚠ 所有下载源失败,使用内置 gradle-wrapper.jar\e[0m"
|
304
|
+
if use_builtin_gradle_wrapper_jar(wrapper_jar_path, gradle_version)
|
305
|
+
return true
|
306
|
+
end
|
307
|
+
|
308
|
+
puts "\e[31m✗ 无法获取有效的 gradle-wrapper.jar\e[0m"
|
345
309
|
false
|
346
310
|
end
|
347
311
|
|
348
|
-
|
312
|
+
|
313
|
+
# 改进的手动生成wrapper逻辑(带内置文件回退)
|
349
314
|
def generate_wrapper_manually(project_path, gradle_version)
|
350
315
|
puts "手动生成gradle wrapper..."
|
351
316
|
|
@@ -353,20 +318,24 @@ module Pindo
|
|
353
318
|
wrapper_dir = File.join(project_path, "gradle/wrapper")
|
354
319
|
FileUtils.mkdir_p(wrapper_dir)
|
355
320
|
|
356
|
-
# 生成gradlew
|
321
|
+
# 1. 生成gradlew脚本(带内置文件回退)
|
357
322
|
gradlew_path = File.join(project_path, "gradlew")
|
358
323
|
unless File.exist?(gradlew_path)
|
359
324
|
puts "生成gradlew脚本..."
|
360
|
-
generate_gradlew_script(project_path)
|
325
|
+
unless generate_gradlew_script(project_path)
|
326
|
+
puts "\e[31m✗ 生成gradlew脚本失败\e[0m"
|
327
|
+
return false
|
328
|
+
end
|
361
329
|
end
|
362
330
|
|
363
|
-
# 生成gradle-wrapper.jar
|
331
|
+
# 2. 生成gradle-wrapper.jar(带缓存和内置文件回退)
|
364
332
|
wrapper_jar_path = File.join(wrapper_dir, "gradle-wrapper.jar")
|
365
333
|
unless File.exist?(wrapper_jar_path)
|
366
334
|
puts "生成gradle-wrapper.jar..."
|
367
|
-
|
368
|
-
|
369
|
-
|
335
|
+
unless download_gradle_wrapper_jar(wrapper_dir, gradle_version)
|
336
|
+
puts "\e[31m✗ 生成gradle-wrapper.jar失败\e[0m"
|
337
|
+
return false
|
338
|
+
end
|
370
339
|
end
|
371
340
|
|
372
341
|
puts "\e[32m✓ gradle wrapper手动生成成功\e[0m"
|
@@ -376,120 +345,248 @@ module Pindo
|
|
376
345
|
false
|
377
346
|
end
|
378
347
|
|
379
|
-
#
|
348
|
+
# 获取缓存目录路径
|
349
|
+
def get_gradle_wrapper_cache_dir
|
350
|
+
File.expand_path("~/.pindo/pindo_common_config/android_tools/gradle-wrapper-cache")
|
351
|
+
end
|
352
|
+
|
353
|
+
# 获取内置文件路径
|
354
|
+
def get_builtin_gradle_wrapper_jar_path
|
355
|
+
File.expand_path("~/.pindo/pindo_common_config/android_tools/gradle-wrapper.jar")
|
356
|
+
end
|
357
|
+
|
358
|
+
def get_builtin_gradlew_path
|
359
|
+
File.expand_path("~/.pindo/pindo_common_config/android_tools/gradlew")
|
360
|
+
end
|
361
|
+
|
362
|
+
# 检查并获取缓存的 gradle-wrapper.jar
|
363
|
+
def get_cached_gradle_wrapper_jar(gradle_version)
|
364
|
+
cache_dir = get_gradle_wrapper_cache_dir
|
365
|
+
FileUtils.mkdir_p(cache_dir)
|
366
|
+
|
367
|
+
cached_jar = File.join(cache_dir, "gradle-wrapper-#{gradle_version}.jar")
|
368
|
+
|
369
|
+
if File.exist?(cached_jar) && verify_gradle_wrapper_jar_complete(cached_jar, gradle_version)
|
370
|
+
puts "\e[32m✓ 使用缓存的 gradle-wrapper.jar (版本: #{gradle_version})\e[0m"
|
371
|
+
return cached_jar
|
372
|
+
end
|
373
|
+
|
374
|
+
nil
|
375
|
+
end
|
376
|
+
|
377
|
+
# 增强的 gradle-wrapper.jar 验证
|
378
|
+
def verify_gradle_wrapper_jar_complete(jar_path, expected_version)
|
379
|
+
return false unless File.exist?(jar_path)
|
380
|
+
|
381
|
+
# 检查文件大小(正常应该在 50KB-200KB 之间)
|
382
|
+
file_size = File.size(jar_path)
|
383
|
+
unless file_size.between?(50000, 200000)
|
384
|
+
puts "\e[33m⚠ gradle-wrapper.jar 大小异常: #{file_size} 字节\e[0m"
|
385
|
+
return false
|
386
|
+
end
|
387
|
+
|
388
|
+
# 检查 jar 文件是否包含必要的类
|
389
|
+
required_classes = [
|
390
|
+
"org.gradle.wrapper.GradleWrapperMain",
|
391
|
+
"org.gradle.cli.CommandLineParser",
|
392
|
+
"org.gradle.wrapper.WrapperExecutor"
|
393
|
+
]
|
394
|
+
|
395
|
+
missing_classes = []
|
396
|
+
required_classes.each do |class_name|
|
397
|
+
unless verify_jar_contains_class(jar_path, class_name)
|
398
|
+
missing_classes << class_name
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
if missing_classes.any?
|
403
|
+
puts "\e[33m⚠ gradle-wrapper.jar 缺少必要类: #{missing_classes.join(', ')}\e[0m"
|
404
|
+
return false
|
405
|
+
end
|
406
|
+
|
407
|
+
puts "\e[32m✓ gradle-wrapper.jar 验证通过\e[0m"
|
408
|
+
true
|
409
|
+
end
|
410
|
+
|
411
|
+
# 检查 jar 文件是否包含指定类
|
412
|
+
def verify_jar_contains_class(jar_path, class_name)
|
413
|
+
class_file = class_name.gsub('.', '/') + '.class'
|
414
|
+
system("jar -tf #{jar_path} | grep -q '#{class_file}'")
|
415
|
+
end
|
416
|
+
|
417
|
+
# 使用内置的 gradle-wrapper.jar
|
418
|
+
def use_builtin_gradle_wrapper_jar(wrapper_jar_path, gradle_version)
|
419
|
+
builtin_jar = get_builtin_gradle_wrapper_jar_path
|
420
|
+
|
421
|
+
unless File.exist?(builtin_jar)
|
422
|
+
puts "\e[31m✗ 内置 gradle-wrapper.jar 不存在: #{builtin_jar}\e[0m"
|
423
|
+
return false
|
424
|
+
end
|
425
|
+
|
426
|
+
# 复制内置文件
|
427
|
+
FileUtils.cp(builtin_jar, wrapper_jar_path)
|
428
|
+
puts "\e[33m⚠ 使用内置的 gradle-wrapper.jar\e[0m"
|
429
|
+
|
430
|
+
# 验证复制后的文件
|
431
|
+
if verify_gradle_wrapper_jar_complete(wrapper_jar_path, gradle_version)
|
432
|
+
puts "\e[32m✓ 内置 gradle-wrapper.jar 验证通过\e[0m"
|
433
|
+
return true
|
434
|
+
else
|
435
|
+
puts "\e[31m✗ 内置 gradle-wrapper.jar 验证失败\e[0m"
|
436
|
+
return false
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
# 使用内置的 gradlew 脚本
|
441
|
+
def use_builtin_gradlew_script(project_path)
|
442
|
+
builtin_gradlew = get_builtin_gradlew_path
|
443
|
+
gradlew_path = File.join(project_path, "gradlew")
|
444
|
+
|
445
|
+
unless File.exist?(builtin_gradlew)
|
446
|
+
puts "\e[31m✗ 内置 gradlew 脚本不存在: #{builtin_gradlew}\e[0m"
|
447
|
+
return false
|
448
|
+
end
|
449
|
+
|
450
|
+
# 复制内置脚本
|
451
|
+
FileUtils.cp(builtin_gradlew, gradlew_path)
|
452
|
+
system("chmod", "+x", gradlew_path)
|
453
|
+
puts "\e[33m⚠ 使用内置的 gradlew 脚本\e[0m"
|
454
|
+
puts "\e[32m✓ 内置 gradlew 脚本复制完成\e[0m"
|
455
|
+
true
|
456
|
+
end
|
457
|
+
|
458
|
+
# 保存到缓存的 gradle-wrapper.jar
|
459
|
+
def save_to_cache(wrapper_jar_path, gradle_version)
|
460
|
+
cache_dir = get_gradle_wrapper_cache_dir
|
461
|
+
FileUtils.mkdir_p(cache_dir)
|
462
|
+
|
463
|
+
cached_jar = File.join(cache_dir, "gradle-wrapper-#{gradle_version}.jar")
|
464
|
+
FileUtils.cp(wrapper_jar_path, cached_jar)
|
465
|
+
puts "\e[32m✓ gradle-wrapper.jar 已保存到缓存: #{cached_jar}\e[0m"
|
466
|
+
end
|
467
|
+
|
468
|
+
# 改进的下载标准 gradle-wrapper.jar(使用正确的下载策略)
|
380
469
|
def download_standard_wrapper_jar(wrapper_jar_path, gradle_version)
|
381
470
|
puts "下载标准的gradle-wrapper.jar..."
|
382
471
|
|
383
|
-
#
|
384
|
-
|
385
|
-
"https://
|
386
|
-
"https://raw.githubusercontent.com/gradle/gradle/v#{gradle_version}/gradle/wrapper/gradle-wrapper.jar"
|
472
|
+
# 使用正确的下载策略:从Gradle分发包中提取wrapper jar
|
473
|
+
gradle_dist_urls = [
|
474
|
+
"https://services.gradle.org/distributions/gradle-#{gradle_version}-bin.zip"
|
387
475
|
]
|
388
476
|
|
389
|
-
|
390
|
-
puts "
|
391
|
-
if
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
477
|
+
gradle_dist_urls.each do |url|
|
478
|
+
puts "尝试从Gradle分发包下载: #{url}"
|
479
|
+
if download_and_extract_wrapper_from_distribution(url, wrapper_jar_path, gradle_version)
|
480
|
+
puts "\e[32m✓ 从Gradle分发包成功提取gradle-wrapper.jar\e[0m"
|
481
|
+
# 保存到缓存
|
482
|
+
save_to_cache(wrapper_jar_path, gradle_version)
|
483
|
+
return true
|
396
484
|
end
|
397
485
|
end
|
398
486
|
|
399
|
-
|
487
|
+
|
488
|
+
puts "\e[31m✗ 下载 gradle-wrapper.jar 失败\e[0m"
|
400
489
|
false
|
401
490
|
end
|
402
491
|
|
403
|
-
#
|
404
|
-
def
|
405
|
-
puts "下载gradle分发包并生成wrapper..."
|
406
|
-
|
492
|
+
# 从Gradle分发包中下载并提取wrapper jar
|
493
|
+
def download_and_extract_wrapper_from_distribution(dist_url, wrapper_jar_path, gradle_version)
|
407
494
|
begin
|
408
495
|
# 创建临时目录
|
409
|
-
temp_dir = Dir.mktmpdir("
|
496
|
+
temp_dir = Dir.mktmpdir("gradle_dist_")
|
497
|
+
zip_path = File.join(temp_dir, "gradle-#{gradle_version}-bin.zip")
|
498
|
+
|
499
|
+
# 下载Gradle分发包
|
500
|
+
puts "下载Gradle分发包: #{dist_url}"
|
501
|
+
unless download_with_curl(dist_url, zip_path)
|
502
|
+
puts "\e[33m⚠ 下载Gradle分发包失败\e[0m"
|
503
|
+
return false
|
504
|
+
end
|
505
|
+
|
506
|
+
# 检查下载的文件大小
|
507
|
+
unless File.exist?(zip_path) && File.size(zip_path) > 1000000 # 至少1MB
|
508
|
+
puts "\e[33m⚠ 下载的Gradle分发包文件异常\e[0m"
|
509
|
+
return false
|
510
|
+
end
|
511
|
+
|
512
|
+
# 解压Gradle分发包
|
513
|
+
puts "解压Gradle分发包..."
|
514
|
+
unless system("cd #{temp_dir} && unzip -q gradle-#{gradle_version}-bin.zip")
|
515
|
+
puts "\e[33m⚠ 解压Gradle分发包失败\e[0m"
|
516
|
+
return false
|
517
|
+
end
|
518
|
+
|
519
|
+
# 查找gradle-wrapper jar文件
|
410
520
|
gradle_dir = File.join(temp_dir, "gradle-#{gradle_version}")
|
521
|
+
wrapper_jar_source = File.join(gradle_dir, "lib", "gradle-wrapper-#{gradle_version}.jar")
|
522
|
+
|
523
|
+
unless File.exist?(wrapper_jar_source)
|
524
|
+
puts "\e[33m⚠ 在Gradle分发包中未找到gradle-wrapper jar文件\e[0m"
|
525
|
+
return false
|
526
|
+
end
|
411
527
|
|
412
|
-
#
|
413
|
-
|
414
|
-
|
415
|
-
"https://github.com/gradle/gradle-distributions/releases/download/v#{gradle_version}/gradle-#{gradle_version}-bin.zip"
|
416
|
-
]
|
528
|
+
# 解压gradle-wrapper jar文件,提取真正的gradle-wrapper.jar
|
529
|
+
extract_temp_dir = Dir.mktmpdir("gradle_wrapper_extract_")
|
530
|
+
extract_cmd = "cd #{extract_temp_dir} && unzip -q '#{wrapper_jar_source}'"
|
417
531
|
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
if download_with_curl(url, zip_path)
|
424
|
-
# 解压gradle分发包
|
425
|
-
if system("cd #{temp_dir} && unzip -q gradle-#{gradle_version}-bin.zip")
|
426
|
-
download_success = true
|
427
|
-
puts "✓ gradle分发包下载并解压成功"
|
428
|
-
break
|
429
|
-
end
|
430
|
-
end
|
532
|
+
unless system(extract_cmd)
|
533
|
+
puts "\e[33m⚠ 解压gradle-wrapper jar文件失败\e[0m"
|
534
|
+
FileUtils.rm_rf(extract_temp_dir)
|
535
|
+
return false
|
431
536
|
end
|
432
537
|
|
433
|
-
|
434
|
-
|
538
|
+
# 查找解压后的gradle-wrapper.jar文件
|
539
|
+
extracted_wrapper_jar = File.join(extract_temp_dir, "gradle-wrapper.jar")
|
540
|
+
|
541
|
+
unless File.exist?(extracted_wrapper_jar)
|
542
|
+
puts "\e[33m⚠ 在解压后的文件中未找到gradle-wrapper.jar\e[0m"
|
543
|
+
FileUtils.rm_rf(extract_temp_dir)
|
435
544
|
return false
|
436
545
|
end
|
437
546
|
|
438
|
-
#
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
cmd = "#{gradle_bin} wrapper --gradle-version #{gradle_version}"
|
443
|
-
puts "执行命令: #{cmd}"
|
444
|
-
|
445
|
-
result = system(cmd)
|
446
|
-
if result
|
447
|
-
puts "\e[32m✓ gradle wrapper生成成功\e[0m"
|
448
|
-
# 重要:在清理临时目录之前,确保wrapper已经生成完成
|
449
|
-
# 等待一下确保文件写入完成
|
450
|
-
sleep(1)
|
451
|
-
return true
|
452
|
-
else
|
453
|
-
puts "\e[31m✗ gradle wrapper生成失败\e[0m"
|
454
|
-
return false
|
455
|
-
end
|
456
|
-
end
|
457
|
-
else
|
458
|
-
puts "\e[31m✗ 未找到gradle可执行文件\e[0m"
|
547
|
+
# 验证解压后的wrapper jar文件
|
548
|
+
unless verify_gradle_wrapper_jar_complete(extracted_wrapper_jar, gradle_version)
|
549
|
+
puts "\e[33m⚠ 解压后的wrapper jar文件验证失败\e[0m"
|
550
|
+
FileUtils.rm_rf(extract_temp_dir)
|
459
551
|
return false
|
460
552
|
end
|
461
553
|
|
554
|
+
# 复制解压后的wrapper jar文件到目标位置
|
555
|
+
FileUtils.cp(extracted_wrapper_jar, wrapper_jar_path)
|
556
|
+
puts "\e[32m✓ 成功从Gradle分发包提取gradle-wrapper.jar\e[0m"
|
557
|
+
|
558
|
+
# 清理临时目录
|
559
|
+
FileUtils.rm_rf(extract_temp_dir)
|
560
|
+
|
561
|
+
return true
|
562
|
+
|
462
563
|
rescue => e
|
463
|
-
puts "\e[31m✗
|
564
|
+
puts "\e[31m✗ 从Gradle分发包提取wrapper jar异常: #{e.message}\e[0m"
|
464
565
|
false
|
465
566
|
ensure
|
466
|
-
#
|
567
|
+
# 清理临时目录
|
467
568
|
if temp_dir && File.directory?(temp_dir)
|
468
|
-
puts "清理临时目录: #{temp_dir}"
|
469
569
|
FileUtils.rm_rf(temp_dir)
|
470
570
|
end
|
471
571
|
end
|
472
572
|
end
|
473
573
|
|
474
|
-
|
574
|
+
|
575
|
+
# 简化的curl下载方法(直接使用简化版本)
|
475
576
|
def download_with_curl(url, file_path)
|
476
577
|
puts "使用curl下载: #{url}"
|
477
578
|
|
478
|
-
#
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
'--user-agent', 'Pindo Gradle Wrapper Helper/1.0',
|
488
|
-
'-o', file_path, # 输出文件
|
489
|
-
url
|
490
|
-
]
|
579
|
+
# 检查curl是否可用
|
580
|
+
unless system("which curl > /dev/null 2>&1")
|
581
|
+
puts "\e[31m✗ curl命令不可用,请安装curl\e[0m"
|
582
|
+
return false
|
583
|
+
end
|
584
|
+
|
585
|
+
# 使用简化的curl命令
|
586
|
+
simple_cmd = "curl -L -o '#{file_path}' '#{url}'"
|
587
|
+
puts "执行curl命令: #{simple_cmd}"
|
491
588
|
|
492
|
-
if system(
|
589
|
+
if system(simple_cmd)
|
493
590
|
if File.exist?(file_path) && File.size(file_path) > 0
|
494
591
|
puts "\e[32m✓ curl下载成功: #{File.size(file_path)} 字节\e[0m"
|
495
592
|
return true
|
@@ -498,7 +595,7 @@ module Pindo
|
|
498
595
|
return false
|
499
596
|
end
|
500
597
|
else
|
501
|
-
puts "\e[31m✗ curl
|
598
|
+
puts "\e[31m✗ curl下载失败\e[0m"
|
502
599
|
return false
|
503
600
|
end
|
504
601
|
rescue => e
|
@@ -506,62 +603,10 @@ module Pindo
|
|
506
603
|
false
|
507
604
|
end
|
508
605
|
|
509
|
-
# 验证gradle-wrapper.jar文件
|
510
|
-
def verify_gradle_wrapper_jar(jar_path, expected_version)
|
511
|
-
# 检查文件是否存在且大小合理
|
512
|
-
File.exist?(jar_path) && File.size(jar_path) > MIN_GRADLE_WRAPPER_JAR_SIZE
|
513
|
-
end
|
514
606
|
|
515
607
|
|
516
|
-
# 从gradle分发包中提取gradle-wrapper.jar
|
517
|
-
def extract_gradle_wrapper_jar(zip_path, target_path)
|
518
|
-
puts "正在从gradle分发包中提取gradle-wrapper.jar..."
|
519
|
-
puts "ZIP文件: #{zip_path}"
|
520
|
-
puts "ZIP文件大小: #{File.size(zip_path)} 字节"
|
521
|
-
|
522
|
-
Zip::File.open(zip_path) do |zip_file|
|
523
|
-
puts "ZIP文件包含 #{zip_file.count} 个文件"
|
524
|
-
|
525
|
-
# 列出ZIP文件中的所有文件(用于调试)
|
526
|
-
puts "ZIP文件内容:"
|
527
|
-
zip_file.each_with_index do |entry, index|
|
528
|
-
puts " #{index + 1}. #{entry.name}"
|
529
|
-
break if index >= 10 # 只显示前10个文件
|
530
|
-
end
|
531
|
-
puts " ..." if zip_file.count > 10
|
532
|
-
|
533
|
-
# 查找gradle-wrapper.jar
|
534
|
-
wrapper_entry = zip_file.find { |entry| entry.name.include?('gradle-wrapper.jar') }
|
535
|
-
|
536
|
-
if wrapper_entry
|
537
|
-
puts "找到gradle-wrapper.jar: #{wrapper_entry.name}"
|
538
|
-
wrapper_entry.extract(target_path)
|
539
|
-
puts "\e[32m✓ gradle-wrapper.jar提取成功\e[0m"
|
540
|
-
return true
|
541
|
-
else
|
542
|
-
puts "\e[31m✗ 在gradle分发包中未找到gradle-wrapper.jar\e[0m"
|
543
|
-
puts "尝试查找其他可能的wrapper文件..."
|
544
|
-
|
545
|
-
# 查找其他可能的wrapper文件
|
546
|
-
wrapper_entries = zip_file.select { |entry| entry.name.include?('wrapper') }
|
547
|
-
if wrapper_entries.any?
|
548
|
-
puts "找到以下wrapper相关文件:"
|
549
|
-
wrapper_entries.each do |entry|
|
550
|
-
puts " - #{entry.name}"
|
551
|
-
end
|
552
|
-
else
|
553
|
-
puts "未找到任何wrapper相关文件"
|
554
|
-
end
|
555
|
-
|
556
|
-
return false
|
557
|
-
end
|
558
|
-
end
|
559
|
-
rescue => e
|
560
|
-
puts "\e[31m✗ 解压gradle-wrapper.jar失败: #{e.message}\e[0m"
|
561
|
-
false
|
562
|
-
end
|
563
608
|
|
564
|
-
#
|
609
|
+
# 改进的生成gradlew脚本逻辑(优先生成新脚本)
|
565
610
|
def generate_gradlew_script(project_path)
|
566
611
|
gradlew_path = File.join(project_path, "gradlew")
|
567
612
|
|
@@ -573,7 +618,7 @@ module Pindo
|
|
573
618
|
|
574
619
|
puts "正在生成gradlew脚本..."
|
575
620
|
|
576
|
-
#
|
621
|
+
# 1. 优先生成新的gradlew脚本
|
577
622
|
gradlew_content = generate_gradlew_content()
|
578
623
|
|
579
624
|
# 写入gradlew文件
|
@@ -582,8 +627,20 @@ module Pindo
|
|
582
627
|
# 设置执行权限
|
583
628
|
system("chmod", "+x", gradlew_path)
|
584
629
|
|
585
|
-
|
586
|
-
|
630
|
+
# 验证生成的脚本
|
631
|
+
if File.exist?(gradlew_path) && File.executable?(gradlew_path)
|
632
|
+
puts "\e[32m✓ gradlew脚本生成完成\e[0m"
|
633
|
+
return true
|
634
|
+
end
|
635
|
+
|
636
|
+
# 2. 如果生成失败,回退到内置脚本
|
637
|
+
puts "\e[33m⚠ 生成脚本失败,使用内置 gradlew 脚本\e[0m"
|
638
|
+
if use_builtin_gradlew_script(project_path)
|
639
|
+
return true
|
640
|
+
end
|
641
|
+
|
642
|
+
puts "\e[31m✗ 无法生成有效的 gradlew 脚本\e[0m"
|
643
|
+
false
|
587
644
|
end
|
588
645
|
|
589
646
|
# 生成gradlew脚本内容(通用脚本,适用于所有Gradle项目)
|
@@ -107,6 +107,18 @@ module Pindo
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def get_selected_dev_bundleid()
|
110
|
+
# 检查环境变量
|
111
|
+
env_bundleid = ENV['PINDO_BUNDLE_ID']
|
112
|
+
if env_bundleid && !env_bundleid.empty?
|
113
|
+
puts "\n使用环境变量指定的Bundle ID: #{env_bundleid}"
|
114
|
+
puts
|
115
|
+
# 保存到缓存
|
116
|
+
require_relative '../base/pindocontext'
|
117
|
+
context = Pindo::PindoContext.instance
|
118
|
+
context.set_selection(Pindo::PindoContext::SelectionKey::BUNDLE_ID, env_bundleid)
|
119
|
+
return env_bundleid
|
120
|
+
end
|
121
|
+
|
110
122
|
# 检查缓存
|
111
123
|
require_relative '../base/pindocontext'
|
112
124
|
context = Pindo::PindoContext.instance
|
@@ -138,6 +138,60 @@ module Pindo
|
|
138
138
|
latest_tag = get_latest_version_tag(project_dir: current_git_root_path)
|
139
139
|
|
140
140
|
unless is_tag_at_head?(git_root_dir: current_git_root_path, tag_name: latest_tag)
|
141
|
+
# 检查环境变量
|
142
|
+
env_tag_decision = ENV['PINDO_TAG_DECISION']
|
143
|
+
if env_tag_decision && !env_tag_decision.empty?
|
144
|
+
case env_tag_decision.downcase
|
145
|
+
when 'new', 'new_tag', '1'
|
146
|
+
puts "\n环境变量指定:新增版本号,打新Tag"
|
147
|
+
puts
|
148
|
+
tag_action_parms = []
|
149
|
+
is_need_add_tag = true
|
150
|
+
# 保存到缓存
|
151
|
+
context = PindoContext.instance
|
152
|
+
decision = {
|
153
|
+
tag_action_parms: tag_action_parms,
|
154
|
+
is_need_add_tag: is_need_add_tag,
|
155
|
+
action: :new_tag,
|
156
|
+
description: "新增版本号,打新Tag"
|
157
|
+
}
|
158
|
+
context.set_selection(PindoContext::SelectionKey::TAG_DECISION, decision)
|
159
|
+
return is_need_add_tag, tag_action_parms
|
160
|
+
when 'retag', 'recreate', '2'
|
161
|
+
puts "\n环境变量指定:将上次的Tag删除重新打Tag"
|
162
|
+
puts
|
163
|
+
tag_action_parms = ['--retag']
|
164
|
+
is_need_add_tag = true
|
165
|
+
# 保存到缓存
|
166
|
+
context = PindoContext.instance
|
167
|
+
decision = {
|
168
|
+
tag_action_parms: tag_action_parms,
|
169
|
+
is_need_add_tag: is_need_add_tag,
|
170
|
+
action: :recreate_tag,
|
171
|
+
description: "将上次的Tag删除重新打Tag"
|
172
|
+
}
|
173
|
+
context.set_selection(PindoContext::SelectionKey::TAG_DECISION, decision)
|
174
|
+
return is_need_add_tag, tag_action_parms
|
175
|
+
when 'skip', 'no', 'none', '3'
|
176
|
+
puts "\n环境变量指定:不需要Tag继续编译"
|
177
|
+
puts
|
178
|
+
tag_action_parms = nil
|
179
|
+
is_need_add_tag = false
|
180
|
+
# 保存到缓存
|
181
|
+
context = PindoContext.instance
|
182
|
+
decision = {
|
183
|
+
tag_action_parms: tag_action_parms,
|
184
|
+
is_need_add_tag: is_need_add_tag,
|
185
|
+
action: :continue_without_tag,
|
186
|
+
description: "不需要Tag继续编译且上传"
|
187
|
+
}
|
188
|
+
context.set_selection(PindoContext::SelectionKey::TAG_DECISION, decision)
|
189
|
+
return is_need_add_tag, tag_action_parms
|
190
|
+
when 'exit', 'quit', '4'
|
191
|
+
raise Informative, "环境变量指定:终止退出编译!"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
141
195
|
if auto_mode
|
142
196
|
# 在自动化模式或没有交互式终端时,默认选择新增版本号打新Tag
|
143
197
|
puts "检测到当前代码没有打Tag,在自动模式下将自动新增版本号并打新Tag"
|