pindo 5.6.6 → 5.7.0

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.
@@ -9,52 +9,30 @@ module Pindo
9
9
 
10
10
  # 常量定义
11
11
  RECOMMENDED_GRADLE_VERSION = '7.6.4'
12
- MIN_GRADLE_WRAPPER_JAR_SIZE = 50_000 # 50KB
13
- DOWNLOAD_TIMEOUT = 30 # 30秒
12
+
13
+ # Gradle缓存目录
14
+ GRADLE_CACHE_DIR = File.expand_path("~/.pindo/pindo_common_config/android_tools/gradle-cache")
14
15
 
15
16
  def check_gradle_files(project_path)
16
17
  puts "\e[36m=== 检查Gradle Wrapper配置 ===\e[0m"
17
18
 
18
- # 优先使用基于gradle-wrapper.properties的自动配置
19
+ # 使用基于gradle-wrapper.properties的自动配置
19
20
  if File.exist?(File.join(project_path, "gradle/wrapper/gradle-wrapper.properties"))
20
21
  puts "检测到gradle-wrapper.properties文件,使用自动配置..."
21
22
  if setup_gradle_wrapper_from_properties(project_path)
22
23
  puts "\e[32m✓ 基于gradle-wrapper.properties的自动配置成功\e[0m"
23
24
  return true
24
25
  else
25
- puts "\e[33m⚠ 自动配置失败,回退到传统方式\e[0m"
26
+ puts "\e[31m✗ 自动配置失败\e[0m"
27
+ return false
26
28
  end
27
- end
28
-
29
- # 回退到传统的文件复制方式
30
- puts "使用传统方式配置Gradle Wrapper..."
31
- setup_gradle_wrapper_traditional(project_path)
32
- end
33
-
34
- # 传统的gradle wrapper配置方式(作为回退方案)
35
- def setup_gradle_wrapper_traditional(project_path)
36
- # 检查是否存在 gradlew 文件 如果没有则执行复制操作
37
- gradlew_path = File.join(project_path, "gradlew")
38
- if File.exist?(gradlew_path)
39
- puts "gradlew file already exists, skip copying."
40
29
  else
41
- # 复制gradle相关文件
42
- gradlew_content = File.read(get_build_tools[:gradlew])
43
- File.write(gradlew_path, gradlew_content)
44
- end
45
- # 设置gradlew可执行权限
46
- system("chmod", "777", gradlew_path)
47
-
48
- wrapper_jar_path = File.join(project_path, "gradle/wrapper/gradle-wrapper.jar")
49
- if File.exist?(wrapper_jar_path)
50
- puts "gradle-wrapper.jar file already exists, skip copying."
51
- else
52
- FileUtils.mkdir_p(File.dirname(wrapper_jar_path))
53
- gradle_wrapper_content = File.read(get_build_tools[:gradle_wrapper])
54
- File.write(wrapper_jar_path, gradle_wrapper_content)
30
+ puts "\e[31m✗ 未找到gradle-wrapper.properties文件\e[0m"
31
+ return false
55
32
  end
56
33
  end
57
34
 
35
+
58
36
  def update_build_gradle(project_path)
59
37
  # 更新build.gradle 或 build.gradle.kts
60
38
  build_gradle_path = File.join(project_path, "build.gradle")
@@ -140,24 +118,14 @@ module Pindo
140
118
  puts "\e[36m=== 自动配置Gradle Wrapper ===\e[0m"
141
119
  puts "检测到Gradle版本: #{gradle_version}"
142
120
 
143
- # 确保gradle wrapper目录存在
144
- wrapper_dir = File.join(project_path, "gradle/wrapper")
145
- FileUtils.mkdir_p(wrapper_dir)
146
-
147
- # 下载并配置gradle-wrapper.jar
148
- unless download_gradle_wrapper_jar(wrapper_dir, gradle_version)
149
- puts "\e[31m✗ 下载gradle-wrapper.jar失败\e[0m"
150
- return false
151
- end
152
-
153
- # 生成gradlew脚本
154
- unless generate_gradlew_script(project_path)
155
- puts "\e[31m✗ 生成gradlew脚本失败\e[0m"
121
+ # 改进的wrapper生成策略:优先使用官方Gradle命令
122
+ if setup_gradle_wrapper_improved(project_path, gradle_version)
123
+ puts "\e[32m✓ Gradle Wrapper配置完成\e[0m"
124
+ return true
125
+ else
126
+ puts "\e[31m✗ Gradle Wrapper配置失败\e[0m"
156
127
  return false
157
128
  end
158
-
159
- puts "\e[32m✓ Gradle Wrapper配置完成\e[0m"
160
- true
161
129
  end
162
130
 
163
131
  # 检查gradle wrapper配置是否完整
@@ -204,52 +172,6 @@ module Pindo
204
172
 
205
173
  # 根据当前版本确定目标版本
206
174
  def determine_target_gradle_version(current_version)
207
-
208
- # 版本映射表:当前版本 -> 推荐版本
209
- # 对于旧版本,统一升级到推荐的稳定版本
210
- version_mapping = {
211
- # Gradle 6.x 系列
212
- '6.1.1' => RECOMMENDED_GRADLE_VERSION,
213
- '6.1' => RECOMMENDED_GRADLE_VERSION,
214
- '6.0' => RECOMMENDED_GRADLE_VERSION,
215
-
216
- # Gradle 5.x 系列
217
- '5.6' => RECOMMENDED_GRADLE_VERSION,
218
- '5.5' => RECOMMENDED_GRADLE_VERSION,
219
- '5.4' => RECOMMENDED_GRADLE_VERSION,
220
- '5.3' => RECOMMENDED_GRADLE_VERSION,
221
- '5.2' => RECOMMENDED_GRADLE_VERSION,
222
- '5.1' => RECOMMENDED_GRADLE_VERSION,
223
- '5.0' => RECOMMENDED_GRADLE_VERSION,
224
-
225
- # Gradle 4.x 系列
226
- '4.10' => RECOMMENDED_GRADLE_VERSION,
227
- '4.9' => RECOMMENDED_GRADLE_VERSION,
228
- '4.8' => RECOMMENDED_GRADLE_VERSION,
229
- '4.7' => RECOMMENDED_GRADLE_VERSION,
230
- '4.6' => RECOMMENDED_GRADLE_VERSION,
231
- '4.5' => RECOMMENDED_GRADLE_VERSION,
232
- '4.4' => RECOMMENDED_GRADLE_VERSION,
233
- '4.3' => RECOMMENDED_GRADLE_VERSION,
234
- '4.2' => RECOMMENDED_GRADLE_VERSION,
235
- '4.1' => RECOMMENDED_GRADLE_VERSION,
236
- '4.0' => RECOMMENDED_GRADLE_VERSION,
237
-
238
- # Gradle 3.x 系列
239
- '3.6' => RECOMMENDED_GRADLE_VERSION,
240
- '3.5' => RECOMMENDED_GRADLE_VERSION,
241
- '3.4' => RECOMMENDED_GRADLE_VERSION,
242
- '3.3' => RECOMMENDED_GRADLE_VERSION,
243
- '3.2' => RECOMMENDED_GRADLE_VERSION,
244
- '3.1' => RECOMMENDED_GRADLE_VERSION,
245
- '3.0' => RECOMMENDED_GRADLE_VERSION
246
- }
247
-
248
- # 精确匹配
249
- if version_mapping.key?(current_version)
250
- return version_mapping[current_version]
251
- end
252
-
253
175
  # 主版本号匹配
254
176
  major_version = current_version.split('.').first.to_i
255
177
  case major_version
@@ -264,594 +186,217 @@ module Pindo
264
186
  end
265
187
  end
266
188
 
267
- # 改进的生成gradle-wrapper.jar逻辑(带缓存和内置文件回退)
268
- def download_gradle_wrapper_jar(wrapper_dir, gradle_version)
269
- wrapper_jar_path = File.join(wrapper_dir, "gradle-wrapper.jar")
270
-
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
- return true
275
- end
276
-
277
- puts "正在生成gradle-wrapper.jar (版本: #{gradle_version})..."
278
-
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"
286
- return true
287
- else
288
- puts "\e[33m⚠ 缓存文件验证失败,继续下载\e[0m"
289
- end
290
- end
189
+ # 简化的Gradle Wrapper生成策略
190
+ def setup_gradle_wrapper_improved(project_path, gradle_version)
191
+ puts "\e[36m=== Gradle Wrapper生成策略 ===\e[0m"
291
192
 
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)
296
- return true
297
- else
298
- puts "\e[33m⚠ 下载文件验证失败,使用内置文件\e[0m"
299
- end
300
- end
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
193
+ # 直接下载并设置项目对应的Gradle环境
194
+ if download_and_setup_gradle(gradle_version)
195
+ return generate_gradle_wrapper_official(project_path, gradle_version)
306
196
  end
307
197
 
308
- puts "\e[31m✗ 无法获取有效的 gradle-wrapper.jar\e[0m"
198
+ puts "\e[31m✗ 无法获取有效的Gradle环境\e[0m"
309
199
  false
310
200
  end
311
201
 
312
202
 
313
- # 改进的手动生成wrapper逻辑(带内置文件回退)
314
- def generate_wrapper_manually(project_path, gradle_version)
315
- puts "手动生成gradle wrapper..."
203
+
204
+ # 下载并设置Gradle环境
205
+ def download_and_setup_gradle(gradle_version)
206
+ puts "下载并设置Gradle #{gradle_version}环境..."
316
207
 
317
- # 确保wrapper目录存在
318
- wrapper_dir = File.join(project_path, "gradle/wrapper")
319
- FileUtils.mkdir_p(wrapper_dir)
208
+ # 确保缓存目录存在
209
+ FileUtils.mkdir_p(GRADLE_CACHE_DIR)
320
210
 
321
- # 1. 生成gradlew脚本(带内置文件回退)
322
- gradlew_path = File.join(project_path, "gradlew")
323
- unless File.exist?(gradlew_path)
324
- puts "生成gradlew脚本..."
325
- unless generate_gradlew_script(project_path)
326
- puts "\e[31m✗ 生成gradlew脚本失败\e[0m"
327
- return false
328
- end
211
+ # 检查是否已解压
212
+ gradle_home = File.join(GRADLE_CACHE_DIR, "gradle-#{gradle_version}")
213
+ gradle_bin = File.join(gradle_home, "bin/gradle")
214
+
215
+ if File.exist?(gradle_bin)
216
+ puts " 使用已解压的Gradle #{gradle_version}"
217
+ setup_gradle_environment(gradle_home)
218
+ return true
329
219
  end
330
220
 
331
- # 2. 生成gradle-wrapper.jar(带缓存和内置文件回退)
332
- wrapper_jar_path = File.join(wrapper_dir, "gradle-wrapper.jar")
333
- unless File.exist?(wrapper_jar_path)
334
- puts "生成gradle-wrapper.jar..."
335
- unless download_gradle_wrapper_jar(wrapper_dir, gradle_version)
336
- puts "\e[31m✗ 生成gradle-wrapper.jar失败\e[0m"
337
- return false
338
- end
221
+ # 下载Gradle分发包
222
+ if download_gradle_distribution(gradle_version)
223
+ setup_gradle_environment(gradle_home)
224
+ return true
339
225
  end
340
226
 
341
- puts "\e[32m✓ gradle wrapper手动生成成功\e[0m"
342
- true
343
- rescue => e
344
- puts "\e[31m✗ 手动生成wrapper异常: #{e.message}\e[0m"
345
227
  false
346
228
  end
347
229
 
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
230
+ # 下载Gradle分发包
231
+ def download_gradle_distribution(gradle_version)
232
+ puts "下载Gradle #{gradle_version}分发包..."
373
233
 
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
234
+ distribution_url = "https://services.gradle.org/distributions/gradle-#{gradle_version}-bin.zip"
235
+ cache_file = File.join(GRADLE_CACHE_DIR, "gradle-#{gradle_version}-bin.zip")
236
+ extract_dir = File.join(GRADLE_CACHE_DIR, "gradle-#{gradle_version}")
387
237
 
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
238
+ # 如果已存在ZIP文件,先检查完整性
239
+ if File.exist?(cache_file)
240
+ puts "✓ 发现缓存的Gradle分发包"
241
+ if verify_zip_integrity(cache_file)
242
+ puts "✓ 缓存文件完整性验证通过"
243
+ return extract_gradle_distribution(cache_file, extract_dir, gradle_version)
244
+ else
245
+ puts "⚠ 缓存文件损坏,重新下载"
246
+ FileUtils.rm_f(cache_file)
399
247
  end
400
248
  end
401
249
 
402
- if missing_classes.any?
403
- puts "\e[33m⚠ gradle-wrapper.jar 缺少必要类: #{missing_classes.join(', ')}\e[0m"
404
- return false
250
+ # 下载分发包
251
+ puts "下载Gradle分发包: #{distribution_url}"
252
+ if download_with_curl(distribution_url, cache_file)
253
+ puts "✓ Gradle分发包下载成功"
254
+ return extract_gradle_distribution(cache_file, extract_dir, gradle_version)
405
255
  end
406
256
 
407
- puts "\e[32m✓ gradle-wrapper.jar 验证通过\e[0m"
408
- true
257
+ puts " Gradle分发包下载失败"
258
+ false
409
259
  end
410
260
 
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
261
 
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
262
+ # 简单的ZIP完整性检查
263
+ def verify_zip_integrity(zip_file)
264
+ puts "验证ZIP文件完整性..."
420
265
 
421
- unless File.exist?(builtin_jar)
422
- puts "\e[31m✗ 内置 gradle-wrapper.jar 不存在: #{builtin_jar}\e[0m"
266
+ # 1. 检查文件是否存在
267
+ unless File.exist?(zip_file)
268
+ puts "✗ 文件不存在: #{zip_file}"
423
269
  return false
424
270
  end
425
271
 
426
- # 复制内置文件
427
- FileUtils.cp(builtin_jar, wrapper_jar_path)
428
- puts "\e[33m⚠ 使用内置的 gradle-wrapper.jar\e[0m"
272
+ # 2. 检查文件大小(Gradle分发包通常大于10MB)
273
+ file_size = File.size(zip_file)
274
+ if file_size < 10_000_000 # 10MB
275
+ puts "✗ 文件大小异常: #{file_size} 字节 (应该大于10MB)"
276
+ return false
277
+ end
429
278
 
430
- # 验证复制后的文件
431
- if verify_gradle_wrapper_jar_complete(wrapper_jar_path, gradle_version)
432
- puts "\e[32m✓ 内置 gradle-wrapper.jar 验证通过\e[0m"
279
+ # 3. 使用unzip -t测试ZIP文件完整性
280
+ test_cmd = "unzip -t '#{zip_file}' > /dev/null 2>&1"
281
+ if system(test_cmd)
282
+ puts "✓ ZIP文件完整性验证通过"
433
283
  return true
434
284
  else
435
- puts "\e[31m内置 gradle-wrapper.jar 验证失败\e[0m"
285
+ puts "✗ ZIP文件完整性验证失败"
436
286
  return false
437
287
  end
288
+ rescue => e
289
+ puts "✗ ZIP文件验证异常: #{e.message}"
290
+ false
438
291
  end
439
292
 
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")
293
+ # 使用curl下载文件
294
+ def download_with_curl(url, output_path)
295
+ puts "使用curl下载: #{url}"
444
296
 
445
- unless File.exist?(builtin_gradlew)
446
- puts "\e[31m✗ 内置 gradlew 脚本不存在: #{builtin_gradlew}\e[0m"
447
- return false
448
- end
297
+ # 简化的curl命令,避免特殊字符问题
298
+ cmd = "curl -L -o '#{output_path}' '#{url}'"
299
+ # puts "执行命令: #{cmd}"
449
300
 
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(使用正确的下载策略)
469
- def download_standard_wrapper_jar(wrapper_jar_path, gradle_version)
470
- puts "下载标准的gradle-wrapper.jar..."
471
-
472
- # 使用正确的下载策略:从Gradle分发包中提取wrapper jar
473
- gradle_dist_urls = [
474
- "https://services.gradle.org/distributions/gradle-#{gradle_version}-bin.zip"
475
- ]
476
-
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
484
- end
301
+ if system(cmd)
302
+ puts "✓ curl下载成功: #{File.size(output_path)} 字节"
303
+ return true
304
+ else
305
+ puts " curl下载失败"
306
+ return false
485
307
  end
486
-
487
-
488
- puts "\e[31m✗ 下载 gradle-wrapper.jar 失败\e[0m"
308
+ rescue => e
309
+ puts "✗ curl下载异常: #{e.message}"
489
310
  false
490
311
  end
491
312
 
492
- # Gradle分发包中下载并提取wrapper jar
493
- def download_and_extract_wrapper_from_distribution(dist_url, wrapper_jar_path, gradle_version)
313
+ # 解压Gradle分发包
314
+ def extract_gradle_distribution(zip_file, extract_dir, gradle_version)
315
+ puts "解压Gradle分发包..."
316
+
494
317
  begin
495
- # 创建临时目录
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文件
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
527
-
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}'"
531
-
532
- unless system(extract_cmd)
533
- puts "\e[33m⚠ 解压gradle-wrapper jar文件失败\e[0m"
534
- FileUtils.rm_rf(extract_temp_dir)
535
- return false
536
- end
537
-
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)
544
- return false
545
- end
546
-
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)
318
+ # 使用unzip命令解压
319
+ extract_cmd = "cd '#{File.dirname(extract_dir)}' && unzip -q '#{zip_file}'"
320
+ if system(extract_cmd)
321
+ # 设置执行权限
322
+ gradle_script = File.join(extract_dir, "bin/gradle")
323
+ if File.exist?(gradle_script)
324
+ system("chmod", "+x", gradle_script)
325
+ puts " Gradle分发包解压成功"
326
+ return true
327
+ else
328
+ puts "✗ 解压后未找到gradle可执行文件"
329
+ return false
330
+ end
331
+ else
332
+ puts "✗ Gradle分发包解压失败"
551
333
  return false
552
334
  end
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
-
563
335
  rescue => e
564
- puts "\e[31mGradle分发包提取wrapper jar异常: #{e.message}\e[0m"
336
+ puts "✗ Gradle分发包解压异常: #{e.message}"
565
337
  false
566
- ensure
567
- # 清理临时目录
568
- if temp_dir && File.directory?(temp_dir)
569
- FileUtils.rm_rf(temp_dir)
570
- end
571
338
  end
572
339
  end
573
340
 
574
-
575
- # 简化的curl下载方法(直接使用简化版本)
576
- def download_with_curl(url, file_path)
577
- puts "使用curl下载: #{url}"
578
-
579
- # 检查curl是否可用
580
- unless system("which curl > /dev/null 2>&1")
581
- puts "\e[31m✗ curl命令不可用,请安装curl\e[0m"
341
+ # 设置Gradle环境变量
342
+ def setup_gradle_environment(gradle_home)
343
+ puts "设置Gradle环境变量..."
344
+
345
+ # 直接检查gradle可执行文件
346
+ gradle_bin_dir = File.join(gradle_home, "bin")
347
+ gradle_executable = File.join(gradle_bin_dir, "gradle")
348
+
349
+ puts "检查gradle可执行文件: #{gradle_executable}"
350
+
351
+ unless File.exist?(gradle_executable)
352
+ puts "✗ Gradle可执行文件不存在: #{gradle_executable}"
353
+ # 列出gradle_home目录内容用于调试
354
+ if File.directory?(gradle_home)
355
+ puts "gradle_home目录内容:"
356
+ Dir.entries(gradle_home).each do |entry|
357
+ next if entry.start_with?('.')
358
+ entry_path = File.join(gradle_home, entry)
359
+ if File.directory?(entry_path)
360
+ puts " 目录: #{entry}"
361
+ else
362
+ puts " 文件: #{entry}"
363
+ end
364
+ end
365
+ else
366
+ puts "gradle_home目录不存在: #{gradle_home}"
367
+ end
582
368
  return false
583
369
  end
584
370
 
585
- # 使用简化的curl命令
586
- simple_cmd = "curl -L -o '#{file_path}' '#{url}'"
587
- puts "执行curl命令: #{simple_cmd}"
371
+ # 设置环境变量
372
+ ENV['GRADLE_HOME'] = gradle_home
373
+ ENV['PATH'] = "#{gradle_bin_dir}:#{ENV['PATH']}"
374
+
375
+ puts "✓ Gradle环境变量设置完成"
376
+ puts " GRADLE_HOME: #{ENV['GRADLE_HOME']}"
377
+ puts " PATH已更新: #{gradle_bin_dir}"
588
378
 
589
- if system(simple_cmd)
590
- if File.exist?(file_path) && File.size(file_path) > 0
591
- puts "\e[32m✓ curl下载成功: #{File.size(file_path)} 字节\e[0m"
379
+ true
380
+ end
381
+
382
+ # 使用官方Gradle命令生成wrapper
383
+ def generate_gradle_wrapper_official(project_path, gradle_version)
384
+ Dir.chdir(project_path) do
385
+ # 使用gradle wrapper命令
386
+ cmd = "gradle wrapper"
387
+ # puts "执行命令: #{cmd}"
388
+
389
+ if system(cmd)
390
+ # puts "✓ 官方Gradle命令生成wrapper成功"
592
391
  return true
593
392
  else
594
- puts "\e[31mcurl下载失败: 文件为空或不存在\e[0m"
393
+ puts "✗ 官方Gradle命令生成wrapper失败"
595
394
  return false
596
395
  end
597
- else
598
- puts "\e[31m✗ curl下载失败\e[0m"
599
- return false
600
396
  end
601
397
  rescue => e
602
- puts "\e[31mcurl下载异常: #{e.message}\e[0m"
603
- false
604
- end
605
-
606
-
607
-
608
-
609
- # 改进的生成gradlew脚本逻辑(优先生成新脚本)
610
- def generate_gradlew_script(project_path)
611
- gradlew_path = File.join(project_path, "gradlew")
612
-
613
- # 如果已存在gradlew,检查是否需要更新
614
- if File.exist?(gradlew_path)
615
- puts "\e[32m✓ gradlew脚本已存在\e[0m"
616
- return true
617
- end
618
-
619
- puts "正在生成gradlew脚本..."
620
-
621
- # 1. 优先生成新的gradlew脚本
622
- gradlew_content = generate_gradlew_content()
623
-
624
- # 写入gradlew文件
625
- File.write(gradlew_path, gradlew_content)
626
-
627
- # 设置执行权限
628
- system("chmod", "+x", gradlew_path)
629
-
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"
398
+ puts "✗ 官方Gradle命令执行异常: #{e.message}"
643
399
  false
644
400
  end
645
-
646
- # 生成gradlew脚本内容(通用脚本,适用于所有Gradle项目)
647
- def generate_gradlew_content()
648
- <<~GRADLEW
649
- #!/bin/sh
650
-
651
- #
652
- # Copyright © 2015-2021 the original authors.
653
- #
654
- # Licensed under the Apache License, Version 2.0 (the "License");
655
- # you may not use this file except in compliance with the License.
656
- # You may obtain a copy of the License at
657
- #
658
- # https://www.apache.org/licenses/LICENSE-2.0
659
- #
660
- # Unless required by applicable law or agreed to in writing, software
661
- # distributed under the License is distributed on an "AS IS" BASIS,
662
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
663
- # See the License for the specific language governing permissions and
664
- # limitations under the License.
665
- #
666
-
667
- ##############################################################################
668
- #
669
- # Gradle start up script for UNIX
670
- #
671
- ##############################################################################
672
-
673
- # Attempt to set APP_HOME
674
-
675
- # Resolve links: $0 may be a link
676
- app_path=$0
677
-
678
- # Need this for daisy-chained symlinks.
679
- while
680
- APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
681
- [ -h "$app_path" ]
682
- do
683
- ls=$( ls -ld "$app_path" )
684
- link=${ls#*' -> '}
685
- case $link in #(
686
- /*) app_path=$link ;; #(
687
- *) app_path=$APP_HOME$link ;;
688
- esac
689
- done
690
-
691
- # This is normally unused
692
- # shellcheck disable=SC2034
693
- APP_BASE_NAME=${0##*/}
694
- APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
695
-
696
- # Use the maximum available, or set MAX_FD != -1 to use that value.
697
- MAX_FD=maximum
698
-
699
- warn () {
700
- echo "$*"
701
- } >&2
702
-
703
- die () {
704
- echo
705
- echo "$*"
706
- echo
707
- exit 1
708
- } >&2
709
-
710
- # OS specific support (must be 'true' or 'false').
711
- cygwin=false
712
- msys=false
713
- darwin=false
714
- nonstop=false
715
- case "$( uname )" in #(
716
- CYGWIN* ) cygwin=true ;; #(
717
- Darwin* ) darwin=true ;; #(
718
- MSYS* | MINGW* ) msys=true ;; #(
719
- NONSTOP* ) nonstop=true ;;
720
- esac
721
-
722
- CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
723
-
724
-
725
- # Determine the Java command to use to start the JVM.
726
- if [ -n "$JAVA_HOME" ] ; then
727
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
728
- # IBM's JDK on AIX uses strange locations for the executables
729
- JAVACMD=$JAVA_HOME/jre/sh/java
730
- else
731
- JAVACMD=$JAVA_HOME/bin/java
732
- fi
733
- if [ ! -x "$JAVACMD" ] ; then
734
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
735
-
736
- Please set the JAVA_HOME variable in your environment to match the
737
- location of your Java installation."
738
- fi
739
- else
740
- JAVACMD=java
741
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
742
-
743
- Please set the JAVA_HOME variable in your environment to match the
744
- location of your Java installation."
745
- fi
746
-
747
- # Increase the maximum file descriptors if we can.
748
- if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
749
- case $MAX_FD in #(
750
- max*)
751
- # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
752
- # shellcheck disable=SC2039,SC3045
753
- MAX_FD=$( ulimit -H -n ) ||
754
- warn "Could not query maximum file descriptor limit"
755
- esac
756
- case $MAX_FD in #(
757
- '' | soft) :;; #(
758
- *)
759
- # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
760
- # shellcheck disable=SC2039,SC3045
761
- ulimit -n "$MAX_FD" ||
762
- warn "Could not set maximum file descriptor limit to $MAX_FD"
763
- esac
764
- fi
765
-
766
- # Collect all arguments for the java command, stacking in reverse order:
767
- # * args from the command line
768
- # * the main class name
769
- # * -classpath
770
- # * -D...appname settings
771
- # * --module-path (only if needed)
772
- # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
773
-
774
- # For Cygwin or MSYS, switch paths to Windows format before running java
775
- if "$cygwin" || "$msys" ; then
776
- APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
777
- CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
778
-
779
- JAVACMD=$( cygpath --unix "$JAVACMD" )
780
-
781
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
782
- for arg do
783
- if
784
- case $arg in #(
785
- -*) false ;; # don't mess with options #(
786
- /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
787
- [ -e "$t" ] ;; #(
788
- *) false ;;
789
- esac
790
- then
791
- arg=$( cygpath --path --ignore --mixed "$arg" )
792
- fi
793
- # Roll the args list around exactly as many times as the number of
794
- # args, so each arg winds up back in the position where it started, but
795
- # possibly modified.
796
- #
797
- # NB: a `for` loop captures its iteration list before it begins, so
798
- # changing the positional parameters here affects neither the number of
799
- # iterations, nor the values presented in `arg`.
800
- shift # remove old arg
801
- set -- "$@" "$arg" # push replacement arg
802
- done
803
- fi
804
-
805
-
806
- # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
807
- DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
808
-
809
- # Collect all arguments for the java command:
810
- # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
811
- # and any embedded shellness will be escaped.
812
- # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
813
- # treated as '${Hostname}' itself on the command line.
814
-
815
- set -- \\
816
- "-Dorg.gradle.appname=$APP_BASE_NAME" \\
817
- -classpath "$CLASSPATH" \\
818
- org.gradle.wrapper.GradleWrapperMain \\
819
- "$@"
820
-
821
- # Stop when "xargs" is not available.
822
- if ! command -v xargs >/dev/null 2>&1
823
- then
824
- die "xargs is not available"
825
- fi
826
-
827
- # Use "xargs" to parse quoted args.
828
- #
829
- # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
830
- #
831
- # In Bash we could simply go:
832
- #
833
- # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
834
- # set -- "${ARGS[@]}" "$@"
835
- #
836
- # but POSIX shell has neither arrays nor command substitution, so instead we
837
- # post-process each arg (as a line of input to sed) to backslash-escape any
838
- # character that might be a shell metacharacter, then use eval to reverse
839
- # that process (while maintaining the separation between arguments).
840
- #
841
- # This will of course break if any of these variables contains a newline or
842
- # an unmatched quote.
843
- #
844
-
845
- eval "set -- $(
846
- printf '%s\\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
847
- xargs -n1 |
848
- sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |
849
- tr '\\n' ' '
850
- )" '"$@"'
851
-
852
- exec "$JAVACMD" "$@"
853
- GRADLEW
854
- end
855
-
856
401
  end
857
402
  end