akcache 1.0.0 → 1.1.1

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: 4f40c3531c36cdfba8d66f1a6a25fcb516ed15a30efe06583b3d223e46798bca
4
- data.tar.gz: 42fe053a9c1e6e1eed2780870d19770065cf916435796750a40239f6a7829030
3
+ metadata.gz: a09a77cf0dd1f6e164eedf0a94b3e2f87009416c2ca271acb24a2823c26dd190
4
+ data.tar.gz: 636c83770b0dfc9d78219333daf57cb33b548d69c4f58a85eb753a5355f62f6f
5
5
  SHA512:
6
- metadata.gz: bc2fbd4f27fd460612ccece726184cb9e5e1e71a4e616fbbf229728ab97ed0761f6a93c492ff0e617bf3bddf0bf38bd2793595ac945060c151bc6ffd35df699b
7
- data.tar.gz: 5a8b8c3bc42ee52c60671106a8845551f04f1eb753a2b558065abccfa5041ffabaf00780029c705c46d278ff041fbda47a2d88e397b2b06c33582331f9bf5790
6
+ metadata.gz: 8ca2435c52e371036a4465960eb3504ecf587628becff5f3dd1a15ff5f92b745bcf02ad5d77d23dad0aac0614cd196d3f7c1b906b976dc04e8ff5e42b9b976bd
7
+ data.tar.gz: 8b2185ff6a399a12af7c297c690596d8ac4989d0d3e30bfc41276186fdc98196050773f2a3b0e2aa84a163cfa2e18a81ae6a493011e607c0b9f633bedc2b0346
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kcache (1.0.0)
4
+ akcache (1.0.2)
5
5
  xcodeproj (~> 1.0)
6
6
 
7
7
  GEM
@@ -47,7 +47,7 @@ PLATFORMS
47
47
  universal-darwin-21
48
48
 
49
49
  DEPENDENCIES
50
- kcache!
50
+ akcache!
51
51
  rake (~> 13.0)
52
52
  rubocop (~> 1.7)
53
53
 
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # Kcache
1
+ # AKCache
2
+
2
3
 
3
4
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/kcache`. To experiment with that code, run `bin/console` for an interactive prompt.
4
5
 
data/kcache.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.email = ["1433233832@qq.com"]
13
13
 
14
14
  spec.summary = "a cache tool"
15
- spec.description = "a cache tool that can promote xcode build time"
15
+ spec.description = "a cache tool that can reduce xcode archive time"
16
16
  spec.homepage = "https://github.com/yusheng00"
17
17
  spec.license = "MIT"
18
18
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
@@ -0,0 +1,29 @@
1
+ # AKMall
2
+
3
+ [![CI Status](https://img.shields.io/travis/pangyulei/AKMall.svg?style=flat)](https://travis-ci.org/pangyulei/AKMall)
4
+ [![Version](https://img.shields.io/cocoapods/v/AKMall.svg?style=flat)](https://cocoapods.org/pods/AKMall)
5
+ [![License](https://img.shields.io/cocoapods/l/AKMall.svg?style=flat)](https://cocoapods.org/pods/AKMall)
6
+ [![Platform](https://img.shields.io/cocoapods/p/AKMall.svg?style=flat)](https://cocoapods.org/pods/AKMall)
7
+
8
+ ## Example
9
+
10
+ To run the example project, clone the repo, and run `pod install` from the Example directory first.
11
+
12
+ ## Requirements
13
+
14
+ ## Installation
15
+
16
+ AKMall is available through [CocoaPods](https://cocoapods.org). To install
17
+ it, simply add the following line to your Podfile:
18
+
19
+ ```ruby
20
+ pod 'AKMall'
21
+ ```
22
+
23
+ ## Author
24
+
25
+ pangyulei, pangyulei@gmail.com
26
+
27
+ ## License
28
+
29
+ AKMall is available under the MIT license. See the LICENSE file for more info.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kcache
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.1"
5
5
  end
data/lib/kcache.rb CHANGED
@@ -38,9 +38,9 @@ OBJROOT = "OBJROOT"
38
38
  #变量
39
39
  $podfile_spec_checksums = nil
40
40
  $file_md5_hash = {}
41
+ $exclude_target = []
41
42
 
42
-
43
- class CacheManager
43
+ class CacheManager
44
44
 
45
45
  def get_cache_root
46
46
  return Dir.home + "/ysCache"
@@ -82,23 +82,24 @@ $file_md5_hash = {}
82
82
  end
83
83
  return wrapper_project_paths.uniq
84
84
  end
85
+
85
86
 
86
87
  def backup_project(project)
87
- command = "cp \"#{project.path}/project.pbxproj\" \"#{project.path}/project.ysTest_backup_pbxproj\""
88
+ command = "cp \"#{project.path}/project.pbxproj\" \"#{project.path}/ysTest_backup.pbxproj\""
88
89
  raise unless system command
89
90
  end
90
91
 
91
92
  def clean_temp_files
92
- command = "rm -rf Pods/*.xcodeproj/project.ysTest_backup_pbxproj"
93
- raise unless system command
93
+ # command = "rm -rf Pods/*.xcodeproj/ysTest_backup.pbxproj"
94
+ # raise unless system command
94
95
 
95
96
  command = "rm -rf Pods/*.xcodeproj/*.#{FILE_NAME_TARGET_CONTEXT}"
96
97
  raise unless system command
97
98
  end
98
99
 
99
100
  def restore_project(project)
100
- if File.exist? "#{project.path}/project.ysTest_backup_pbxproj"
101
- command = "mv \"#{project.path}/project.ysTest_backup_pbxproj\" \"#{project.path}/project.pbxproj\""
101
+ if File.exist? "#{project.path}/ysTest_backup.pbxproj"
102
+ command = "mv \"#{project.path}/ysTest_backup.pbxproj\" \"#{project.path}/project.pbxproj\""
102
103
  raise unless system command
103
104
  end
104
105
  end
@@ -152,6 +153,7 @@ $file_md5_hash = {}
152
153
  file_path = file.file_ref.real_path.to_s
153
154
  files.push file_path
154
155
  end
156
+
155
157
  #获取所有头文件(.h)
156
158
  target.headers_build_phase.files.each do | file |
157
159
  file_path = file.file_ref.real_path.to_s
@@ -296,7 +298,7 @@ $file_md5_hash = {}
296
298
  if target_context[:target_md5] != target_md5 or target_context[:product_md5] != get_file_md5(target_cache_dir + "/" + FILE_NAME_PRODUCT)
297
299
  command = "rm -rf \"#{target_cache_dir}\""
298
300
  raise unless system command
299
- puts "<ERROR> #{target.name} target md5 dose not match: #{target_cache_dir}"
301
+ puts "<ERROR> #{target.name} target md5 does not match: #{target_cache_dir}"
300
302
  end
301
303
 
302
304
  dependency_exit = true
@@ -306,12 +308,12 @@ $file_md5_hash = {}
306
308
  dependency_file = item[0]
307
309
  dependency_md5 = item[1]
308
310
  unless File.exist? dependency_file
309
- # puts "<WARNING> #{target.name} dependency file miss: #{dependency_file}"
311
+ puts "<WARNING> #{target.name} dependency file miss: #{dependency_file}"
310
312
  dependency_exit = false
311
313
  break
312
314
  end
313
315
  unless get_file_md5(dependency_file) == dependency_md5
314
- # puts "<WARNING> #{target.name} dependency file md5 dose not match: #{dependency_file}"
316
+ puts "<WARNING> #{target.name} dependency file md5 does not match: #{dependency_file}"
315
317
  dependency_exit = false
316
318
  break
317
319
  end
@@ -344,7 +346,7 @@ $file_md5_hash = {}
344
346
  end
345
347
 
346
348
  def inject_flag_action(project, target)
347
- command_exec = "kcache"
349
+ command_exec = "\"#{$0}\""
348
350
  inject_phase = target.new_shell_script_build_phase("ys_inject_#{target.name}")
349
351
  inject_phase.shell_script = "#{command_exec} #{"inject"} #{target.name} \"#{project.path}\""
350
352
  inject_phase.show_env_vars_in_log = '1'
@@ -352,8 +354,6 @@ $file_md5_hash = {}
352
354
 
353
355
  def inject_copy_action(project, target, target_context)
354
356
  target_cache_dir = target_context[:hit_target_cache_dir]
355
- target_product_dir = target_context[:build_product_dir]
356
- build_intermediate_dir = target_context[:build_intermediate_dir]
357
357
 
358
358
  target.build_phases.delete_if { | build_phase |
359
359
  build_phase.class == Xcodeproj::Project::Object::PBXHeadersBuildPhase or
@@ -361,15 +361,9 @@ $file_md5_hash = {}
361
361
  build_phase.class == Xcodeproj::Project::Object::PBXResourcesBuildPhase
362
362
  }
363
363
 
364
- # if target.name == "EURLocalizedStrings"
365
- # target.build_phases.delete_if { |phase|
366
- # phase.class == Xcodeproj::Project::Object::PBXShellScriptBuildPhase
367
- # }
368
- # end
369
-
370
- command_exec = "kcache"
364
+ command_exec = "\"#{$0}\""
371
365
  inject_phase = target.new_shell_script_build_phase("ys_copy_#{target.name}")
372
- inject_phase.shell_script = "#{command_exec} #{"copy"} \"#{target_cache_dir}\" \"#{target_product_dir}\" \"#{build_intermediate_dir}\""
366
+ inject_phase.shell_script = "#{command_exec} #{"copy"} \"#{target_cache_dir}\""
373
367
  inject_phase.show_env_vars_in_log = '1'
374
368
  end
375
369
 
@@ -379,10 +373,10 @@ $file_md5_hash = {}
379
373
  start_time = Time.now
380
374
  target_cache_dir = ARGV[1]
381
375
  cache_product_path = target_cache_dir + "/#{FILE_NAME_PRODUCT}"
382
-
376
+
383
377
  [SYMROOT, CONFIGURATION_BUILD_DIR, CONFIGURATION_TEMP_DIR, OBJROOT, TARGET_BUILD_DIR, TARGET_TEMP_DIR, SRCROOT, FULL_PRODUCT_NAME].sort.each do | key |
384
378
  unless ENV.has_key? key and ENV[key] and ENV[key].size > 0
385
- raise "<INFO> #{target.name} should have #{key}"
379
+ raise "<INFO> #{$0} should have #{key}"
386
380
  break
387
381
  end
388
382
  end
@@ -413,7 +407,6 @@ $file_md5_hash = {}
413
407
  def add_cache(target, target_info)
414
408
  target_md5 = target_info[:target_md5]
415
409
  product_dir = target_info[CONFIGURATION_BUILD_DIR]
416
- # intermediate_dir = target_info[TARGET_TEMP_DIR]
417
410
  full_product_name = target_info[FULL_PRODUCT_NAME]
418
411
 
419
412
  Dir.glob("#{product_dir}/**/*.modulemap").each do | modulemap |
@@ -440,7 +433,14 @@ $file_md5_hash = {}
440
433
  puts "<INFO> #{command} should succeed"
441
434
  return false
442
435
  end
443
-
436
+
437
+ already_target_cache_dirs = Dir.glob(get_cache_root + "/" + target.name + "-" + target_md5 + "-*")
438
+ already_target_cache_dirs.each do |path|
439
+ if File.exist? path
440
+ raise unless system "rm -rf \"#{path}\""
441
+ end
442
+ end
443
+
444
444
  target_cache_dir = get_cache_root + "/" + target.name + "-" + target_md5 + "-" + (Time.now.to_f * 1000).to_i.to_s
445
445
  if File.exist? target_cache_dir
446
446
  puts "<INFO> #{target_cache_dir} should not exist"
@@ -486,23 +486,59 @@ $file_md5_hash = {}
486
486
  return true
487
487
 
488
488
  end
489
+
490
+ def get_custom_config_information
491
+ if File.exist? "project_cache_config.yml"
492
+ custom_config = YAML.load (File.read("project_cache_config.yml"))
493
+ $exclude_target = custom_config[:exclude_targets]
494
+ else
495
+ source = {
496
+ :description => nil,
497
+ :dependency_check => true,
498
+ :exclude_targets => ["target1", "target2"],
499
+ }.to_yaml
500
+
501
+ substitution_list = {
502
+ /:description:/ => "# You can assign values to these parameters to achieve some custom functions\n",
503
+ /:dependency_check:/ => "\n\n# Whether to check the dependencies of the target. For exzample: target A depends on target B. Under normal circumstances, target B is recompiled, then target A will be recompiled, but if the dependencies are not checked, target A will not be recompiled at this time\n:dependency_check:",
504
+ /:exclude_targets:/ => "\n\n# the targets that will not participate in cache dependency detection\n:exclude_targets:",
505
+ }
506
+
507
+ substitution_list.each do |pattern, replacement|
508
+ source.gsub!(pattern, replacement)
509
+ end
510
+ puts source
511
+ File.write("project_cache_config.yml", source)
512
+ end
489
513
 
490
- def project_task_begin
514
+ end
491
515
 
492
- clean_temp_files
516
+
517
+ def project_task_begin
518
+
493
519
  projects = get_projects
494
520
  total_count = 0
495
521
  hit_count = 0
496
522
  miss_count = 0
497
523
  error_count = 0
498
524
  hit_target_md5_cache_set = Set.new
525
+ miss_target_cache_set = Set.new
526
+
527
+ get_custom_config_information
499
528
 
500
529
  pre_targets_info = {}
530
+
531
+ projects.each do |project|
532
+ restore_project(project)
533
+ backup_project(project)
534
+ end
535
+
536
+ clean_temp_files
537
+
538
+ projects = get_projects
539
+
501
540
  projects.each do |project|
502
541
  project.native_targets.each do |target|
503
- target.build_phases.delete_if { |phase|
504
- phase.class == Xcodeproj::Project::Object::PBXShellScriptBuildPhase and phase.name.include? "ys_"
505
- }
506
542
  if can_cache_target(target)
507
543
  total_count = total_count + 1
508
544
  source_files = get_target_source_files(target)
@@ -532,58 +568,86 @@ $file_md5_hash = {}
532
568
  end
533
569
  end
534
570
  end
535
-
536
- projects.each do |project|
537
- project.native_targets.each do |target|
538
- target_info = pre_targets_info[target]
539
- next unless target_info and target_info[:target_status] != CACHE_STATUS_MISS
540
- hit_target_cache_dirs = target_info[:hit_target_cache_dir]
541
- next unless hit_target_cache_dirs and hit_target_cache_dirs.count > 0
542
- target_md5 = target_info[:target_md5]
543
-
544
- really_hit_dir = ""
545
- hit_target_cache_dirs.each do |hit_target_cache_dir|
546
- all_dependency_target_exist = true
547
- hit_targets_info = YAML.load(File.read(hit_target_cache_dir + "/" + FILE_NAME_CONTEXT))
548
- if hit_targets_info[:dependency_targets_md5]
549
- hit_targets_info[:dependency_targets_md5].each do | item |
550
- dependency_target = item[0]
551
- dependency_target_md5 = item[1]
552
- unless hit_target_md5_cache_set.include? "#{dependency_target}-#{dependency_target_md5}"
553
- puts "<INFO> #{target.name} #{target_md5} hit cache, but dependency target #{dependency_target}-#{dependency_target_md5} dose not hit"
554
- all_dependency_target_exist = false
571
+
572
+ while true
573
+ projects.each do |project|
574
+ project.native_targets.each do |target|
575
+ target_info = pre_targets_info[target]
576
+ next unless target_info and target_info[:target_status] != CACHE_STATUS_MISS
577
+ next unless target_info and target_info[:target_status] != CACHE_STATUS_HIT
578
+ hit_target_cache_dirs = target_info[:hit_target_cache_dir]
579
+ next unless hit_target_cache_dirs and hit_target_cache_dirs.count > 0
580
+ target_md5 = target_info[:target_md5]
581
+
582
+ target_really_hit_dir = ""
583
+ target_really_miss = false
584
+ hit_target_cache_dirs.each do |hit_target_cache_dir|
585
+ all_dependency_target_exist = true
586
+ target_really_miss = false
587
+ hit_targets_info = YAML.load(File.read(hit_target_cache_dir + "/" + FILE_NAME_CONTEXT))
588
+ if hit_targets_info[:dependency_targets_md5]
589
+ hit_targets_info[:dependency_targets_md5].each do | item |
590
+ dependency_target = item[0]
591
+ dependency_target_md5 = item[1]
592
+ if $exclude_target.include? dependency_target
593
+ puts "<INFO> #{target.name} #{target_md5} hit cache, dependency target #{dependency_target}-#{dependency_target_md5} skip check"
594
+ next
595
+ end
596
+
597
+ if miss_target_cache_set.include? "#{dependency_target}"
598
+ puts "<INFO> #{target.name} #{target_md5} hit cache, but dependency target #{dependency_target}-#{dependency_target_md5} does not hit"
599
+ target_really_miss = true
600
+ all_dependency_target_exist = false
601
+ break
602
+ end
603
+
604
+ unless hit_target_md5_cache_set.include? "#{dependency_target}-#{dependency_target_md5}"
605
+ puts "<INFO> #{target.name} #{target_md5} hit cache, but dependency target #{dependency_target}-#{dependency_target_md5} does not hit"
606
+ all_dependency_target_exist = false
607
+ target_really_miss = true
608
+ break
609
+ end
610
+ end
611
+
612
+ if all_dependency_target_exist
613
+ target_really_hit_dir = hit_target_cache_dir
614
+ break
615
+ end
616
+
617
+ if target_really_miss
555
618
  break
556
619
  end
557
- end
558
-
559
- if all_dependency_target_exist
560
- really_hit_dir = hit_target_cache_dir
561
- break
562
620
  end
563
621
  end
622
+
623
+ if target_really_hit_dir.length > 0
624
+ puts "<INFO> #{target.name} #{target_md5} hit cache"
625
+ hit_count = hit_count + 1
626
+ hit_target_info = YAML.load(File.read(target_really_hit_dir + "/" + FILE_NAME_CONTEXT))
627
+ target_info = target_info.merge!(hit_target_info)
628
+ target_info[:target_status] = CACHE_STATUS_HIT
629
+ target_info[:hit_target_cache_dir] = target_really_hit_dir
630
+ inject_copy_action(project, target, target_info)
631
+ end
632
+
633
+ if target_really_miss
634
+ miss_count = miss_count + 1
635
+ miss_target_cache_set.add "#{target.name}"
636
+ hit_target_md5_cache_set.delete "#{target.name}-#{target_info[:target_md5]}"
637
+ target_info[:target_status] = CACHE_STATUS_MISS
638
+ target_info.delete(:hit_target_cache_dir)
639
+ inject_flag_action(project, target)
640
+ end
641
+
642
+ File.write("#{project.path}/#{target.name}.#{FILE_NAME_TARGET_CONTEXT}", target_info.to_yaml)
564
643
  end
565
-
566
- if really_hit_dir.length > 0
567
- puts "<INFO> #{target.name} #{target_md5} hit cache"
568
- hit_count = hit_count + 1
569
- hit_target_info = YAML.load(File.read(really_hit_dir + "/" + FILE_NAME_CONTEXT))
570
- target_info = target_info.merge!(hit_target_info)
571
- target_info[:target_status] = CACHE_STATUS_HIT
572
- target_info[:hit_target_cache_dir] = really_hit_dir
573
- inject_copy_action(project, target, target_info)
574
- else
575
- puts "<INFO> #{target.name} #{target_md5} miss cache for reason dependency miss"
576
- target_info[:target_status] = CACHE_STATUS_MISS
577
- target_info.delete(:hit_target_cache_dir)
578
- inject_flag_action(project, target)
579
- miss_count = miss_count + 1
580
- end
581
- File.write("#{project.path}/#{target.name}.#{FILE_NAME_TARGET_CONTEXT}", target_info.to_yaml)
582
-
644
+ project.save
645
+ end
646
+ if total_count == hit_count + miss_count + error_count
647
+ break
648
+ else
649
+ puts "<INFO> continue to find hit cache"
583
650
  end
584
-
585
- backup_project(project)
586
- project.save
587
651
  end
588
652
  puts "<INFO> total count: #{total_count}, hit count: #{hit_count}, miss_count: #{miss_count}, error_count: #{error_count}"
589
653
  end
@@ -734,7 +798,6 @@ $file_md5_hash = {}
734
798
 
735
799
  puts "<INFO> total add cache count: #{total_add_count}"
736
800
  end
737
-
738
801
 
739
802
  end
740
803
 
data/lib/pod_plugin.rb ADDED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: akcache
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - yusheng
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-08 00:00:00.000000000 Z
11
+ date: 2021-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
- description: a cache tool that can promote xcode build time
27
+ description: a cache tool that can reduce xcode archive time
28
28
  email:
29
29
  - 1433233832@qq.com
30
30
  executables:
@@ -47,7 +47,9 @@ files:
47
47
  - bin/setup
48
48
  - kcache.gemspec
49
49
  - lib/kcache.rb
50
+ - lib/kcache/README.md
50
51
  - lib/kcache/version.rb
52
+ - lib/pod_plugin.rb
51
53
  homepage: https://github.com/yusheng00
52
54
  licenses:
53
55
  - MIT
@@ -55,7 +57,7 @@ metadata:
55
57
  homepage_uri: https://github.com/yusheng00
56
58
  source_code_uri: https://github.com/yusheng00
57
59
  changelog_uri: https://github.com/yusheng00
58
- post_install_message:
60
+ post_install_message:
59
61
  rdoc_options: []
60
62
  require_paths:
61
63
  - lib
@@ -70,8 +72,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
72
  - !ruby/object:Gem::Version
71
73
  version: '0'
72
74
  requirements: []
73
- rubygems_version: 3.0.6
74
- signing_key:
75
+ rubygems_version: 3.1.6
76
+ signing_key:
75
77
  specification_version: 4
76
78
  summary: a cache tool
77
79
  test_files: []