zabel 1.0.2 → 1.0.3
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/.gitignore +1 -0
- data/README.md +39 -10
- data/bin/zabel +12 -3
- data/lib/zabel.rb +15 -60
- data/lib/zabel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c252d78baa1f53c925ae86fcd441c044e36240b25d4d9586e27e922901c0cc91
|
4
|
+
data.tar.gz: f3d310882935e4010bdce00b4a0fb248df34639a8af59a35f032491d2b478881
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6adde390bb82e92bbf984530690bf399b062e689696bdff2fcc82e2d4c2cd9109ee54f8ead16308000999577cca6865893580aeaef37228e388c51ab678f62a
|
7
|
+
data.tar.gz: ab08a8ac353e898945f8d7b7866caf890a027e31729af110d89d1bed1b32d71130ab6a0a282d0bb352ff2bed948e82f8000458a2545897651e7de5c499976c31
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Zabel, is a build cacher for Xcode, using Xcodeproj and MD5, to detect and cache products for targets. Designed for CI by now. Zabel is not Bazel.
|
4
4
|
|
5
|
+
WARNING: BE CAREFUL IN PRODUCTION ENVIRONMENT.
|
6
|
+
|
5
7
|
## Feature
|
6
8
|
|
7
9
|
- only support Cocoapods targets now
|
@@ -23,9 +25,13 @@ Zabel, is a build cacher for Xcode, using Xcodeproj and MD5, to detect and cache
|
|
23
25
|
|
24
26
|
## Installation
|
25
27
|
|
28
|
+
Please use Ruby 2.x.
|
29
|
+
|
26
30
|
Add this line to your application's Gemfile:
|
27
31
|
|
28
32
|
```ruby
|
33
|
+
source "https://rubygems.org"
|
34
|
+
|
29
35
|
gem 'zabel'
|
30
36
|
```
|
31
37
|
|
@@ -33,30 +39,53 @@ And then execute:
|
|
33
39
|
|
34
40
|
$ bundle
|
35
41
|
|
42
|
+
Or install in local path:
|
43
|
+
|
44
|
+
$ bundle install --path vendor/bundle
|
45
|
+
|
36
46
|
Or install it yourself as:
|
37
47
|
|
38
|
-
$ gem install zabel
|
48
|
+
$ [sudo] gem install zabel
|
39
49
|
|
40
50
|
## Usage
|
41
51
|
|
42
|
-
Simply add zabel before your xcodebuild/fastlane command. Please ensure that your command can work without zabel.
|
52
|
+
Simply add zabel before your xcodebuild/fastlane command. Please ensure that your command can work without zabel.
|
43
53
|
|
44
|
-
|
45
|
-
zabel xcodebuild/fastlane xxx
|
46
|
-
```
|
54
|
+
$ [bundle exec] zabel xcodebuild/fastlane ...
|
47
55
|
|
48
56
|
## Advanced usage
|
49
57
|
|
50
58
|
You can controll your cache keys, which can be more or less. Please ensure that your arguments are same in pre and post.
|
51
59
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
60
|
+
$ [bundle exec] zabel pre -configuration Debug ...
|
61
|
+
$ xcodebuild/fastlane ...
|
62
|
+
$ [bundle exec] zabel post -configuration Debug ...
|
63
|
+
|
64
|
+
Importantly, configuration argument must be set with zabel.
|
65
|
+
|
66
|
+
## Options
|
67
|
+
|
68
|
+
You can custom some options by yourself.
|
69
|
+
|
70
|
+
Zabel stores caches in `~/zabel` by default. You can change this path.
|
71
|
+
|
72
|
+
$ export ZABEL_CACHE_ROOT=xxx
|
73
|
+
|
74
|
+
Zabel uses LRU to clear unuse old caches, to keep max count with 10000 by default. You can change this number.
|
75
|
+
|
76
|
+
$ export ZABEL_CACHE_COUNT=12345
|
77
|
+
|
78
|
+
Zable caches targets which count of source files is greater than or equal 1 by default. You can set this value to 0 or more than 1 to achieve higher total speed.
|
79
|
+
|
80
|
+
$ export ZABEL_MIN_SOURCE_FILE_COUNT=10
|
81
|
+
|
82
|
+
Zabel detects module map dependecy by default. However, there are bugs of xcodebuild or swift-frontend, which emits unnecessary, incorrect and even cycle modulemap dependencies. Cycle dependency targets will be miss every time. To test by run "ruby test/one.rb test/todo/modulemap_file/Podfile". You can disable this feature.
|
83
|
+
|
84
|
+
$ export ZABEL_NOT_DETECT_MODULE_MAP_DEPENDENCY=YES
|
57
85
|
|
58
86
|
## Changelog
|
59
87
|
|
88
|
+
- 1.0.3 support bundle install
|
60
89
|
- 1.0.2 support legacy build system
|
61
90
|
- 1.0.1 support xcodebuild archive and fastlane
|
62
91
|
- 1.0.0
|
data/bin/zabel
CHANGED
@@ -24,8 +24,17 @@ elsif ARGV.include?("-configuration") or ARGV.include?("--configuration")
|
|
24
24
|
Zabel::zabel_post(ARGV)
|
25
25
|
|
26
26
|
puts "[ZABEL]<INFO> duration = #{(Time.now - total_start_time).to_i} s in stage all"
|
27
|
-
|
28
|
-
puts "
|
29
|
-
puts "
|
27
|
+
elsif ARGV.size == 0 or (ARGV.size == 1 and ARGV[0].include?("v"))
|
28
|
+
puts "ver: #{Zabel::VERSION}"
|
29
|
+
puts "exe: #{$0}"
|
30
30
|
puts "url: https://github.com/WeijunDeng/Zabel"
|
31
|
+
else
|
32
|
+
puts "Usage: "
|
33
|
+
puts "IMPORTANT: configuration must be set."
|
34
|
+
puts "For example:"
|
35
|
+
puts "zabel xcodebuild archive -workspace app.xcworkspace -scheme app -configuration Debug ..."
|
36
|
+
puts "zabel fastlane gym --workspace app.xcworkspace --scheme app --configuration Debug ..."
|
37
|
+
puts ""
|
38
|
+
puts "Advanced usage:"
|
39
|
+
puts "zabel pre -configuration Debug && xcodebuild/fastlane ... && zabel post -configuration Debug"
|
31
40
|
end
|
data/lib/zabel.rb
CHANGED
@@ -74,10 +74,6 @@ module Zabel
|
|
74
74
|
return 1
|
75
75
|
end
|
76
76
|
|
77
|
-
def self.zabel_should_extract_once
|
78
|
-
return false
|
79
|
-
end
|
80
|
-
|
81
77
|
def self.zabel_get_projects
|
82
78
|
# TODO: to support more project, not only Pods
|
83
79
|
pods_project = Xcodeproj::Project.open("Pods/Pods.xcodeproj")
|
@@ -645,23 +641,7 @@ module Zabel
|
|
645
641
|
return potential_hit_target_cache_dirs
|
646
642
|
end
|
647
643
|
|
648
|
-
|
649
|
-
# and this is faster, without searching deeply.
|
650
|
-
def self.zabel_fast_add_dependency(project, target_target, target, subproject_reference)
|
651
|
-
container_proxy = project.new(Xcodeproj::Project::PBXContainerItemProxy)
|
652
|
-
container_proxy.container_portal = subproject_reference.uuid
|
653
|
-
container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target]
|
654
|
-
container_proxy.remote_global_id_string = target.uuid
|
655
|
-
container_proxy.remote_info = target.name
|
656
|
-
|
657
|
-
dependency = project.new(Xcodeproj::Project::PBXTargetDependency)
|
658
|
-
dependency.name = target.name
|
659
|
-
dependency.target_proxy = container_proxy
|
660
|
-
|
661
|
-
target_target.dependencies << dependency
|
662
|
-
end
|
663
|
-
|
664
|
-
def self.zabel_disable_build_and_inject_extract(project, target, inject_project, inject_target, inject_scripts, target_context)
|
644
|
+
def self.zabel_disable_build_and_inject_extract(project, target, target_context)
|
665
645
|
target_cache_dir = target_context[:hit_target_cache_dir]
|
666
646
|
|
667
647
|
# touch to update mtime
|
@@ -674,34 +654,24 @@ module Zabel
|
|
674
654
|
build_phase.class == Xcodeproj::Project::Object::PBXResourcesBuildPhase
|
675
655
|
}
|
676
656
|
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
subproject_reference = nil
|
681
|
-
project.main_group.files.each do | file |
|
682
|
-
if file.class == Xcodeproj::Project::Object::PBXFileReference and File.basename(file.path) == File.basename(inject_project.path)
|
683
|
-
subproject_reference = file
|
684
|
-
break
|
685
|
-
end
|
686
|
-
end
|
687
|
-
|
688
|
-
unless subproject_reference
|
689
|
-
subproject_reference = project.main_group.new_reference(inject_project.path, :group)
|
690
|
-
end
|
691
|
-
|
692
|
-
zabel_fast_add_dependency(project, target, inject_target, subproject_reference)
|
693
|
-
|
694
|
-
inject_scripts.push extract_script
|
695
|
-
else
|
696
|
-
inject_phase = target.new_shell_script_build_phase("zabel_extract_#{target.name}")
|
697
|
-
inject_phase.shell_script = extract_script
|
698
|
-
inject_phase.show_env_vars_in_log = '1'
|
657
|
+
zabel_exec = "\"#{$0}\""
|
658
|
+
if ENV["BUNDLE_BIN_PATH"] and ENV["BUNDLE_BIN_PATH"].size > 0 and ENV["BUNDLE_GEMFILE"] and ENV["BUNDLE_GEMFILE"].size > 0
|
659
|
+
zabel_exec = "cd \"#{File.dirname(ENV["BUNDLE_GEMFILE"])}\" && \"#{ENV["BUNDLE_BIN_PATH"]}\" exe zabel"
|
699
660
|
end
|
661
|
+
extract_script = "#{zabel_exec} #{STAGE_EXTRACT} \"#{target_cache_dir}\" \"#{target_context[:build_product_dir]}\" \"#{target_context[:build_intermediate_dir]}\""
|
662
|
+
|
663
|
+
inject_phase = target.new_shell_script_build_phase("zabel_extract_#{target.name}")
|
664
|
+
inject_phase.shell_script = extract_script
|
665
|
+
inject_phase.show_env_vars_in_log = '1'
|
700
666
|
end
|
701
667
|
|
702
668
|
def self.zabel_inject_printenv(project, target)
|
669
|
+
zabel_exec = "\"#{$0}\""
|
670
|
+
if ENV["BUNDLE_BIN_PATH"] and ENV["BUNDLE_BIN_PATH"].size > 0 and ENV["BUNDLE_GEMFILE"] and ENV["BUNDLE_GEMFILE"].size > 0
|
671
|
+
zabel_exec = "cd \"#{File.dirname(ENV["BUNDLE_GEMFILE"])}\" && \"#{ENV["BUNDLE_BIN_PATH"]}\" exe zabel"
|
672
|
+
end
|
703
673
|
inject_phase = target.new_shell_script_build_phase("zabel_printenv_#{target.name}")
|
704
|
-
inject_phase.shell_script = "#{
|
674
|
+
inject_phase.shell_script = "#{zabel_exec} #{STAGE_PRINTENV} #{target.name} \"#{project.path}\""
|
705
675
|
inject_phase.show_env_vars_in_log = '1'
|
706
676
|
end
|
707
677
|
|
@@ -728,15 +698,6 @@ module Zabel
|
|
728
698
|
|
729
699
|
zabel_clean_temp_files
|
730
700
|
|
731
|
-
if zabel_should_extract_once
|
732
|
-
inject_project = Xcodeproj::Project.new("Pods/zabel.xcodeproj")
|
733
|
-
inject_target = inject_project.new_aggregate_target("zabel")
|
734
|
-
inject_phase = inject_target.new_shell_script_build_phase("zabel_extract")
|
735
|
-
inject_phase.show_env_vars_in_log = '1'
|
736
|
-
inject_project.save
|
737
|
-
inject_scripts = []
|
738
|
-
end
|
739
|
-
|
740
701
|
projects = zabel_get_projects
|
741
702
|
|
742
703
|
pre_targets_context = {}
|
@@ -823,7 +784,7 @@ module Zabel
|
|
823
784
|
target_context = pre_targets_context[target]
|
824
785
|
|
825
786
|
if target_context[:target_status] == STATUS_HIT
|
826
|
-
zabel_disable_build_and_inject_extract(project, target,
|
787
|
+
zabel_disable_build_and_inject_extract(project, target, target_context)
|
827
788
|
else
|
828
789
|
unless target_context[:target_status] == STATUS_MISS
|
829
790
|
target_context[:target_status] = STATUS_MISS
|
@@ -844,12 +805,6 @@ module Zabel
|
|
844
805
|
zabel_clean_backup_project(project)
|
845
806
|
end
|
846
807
|
end
|
847
|
-
|
848
|
-
if zabel_should_extract_once and inject_scripts.size > 0
|
849
|
-
inject_scripts = (["startTime_s=`date +%s`"] + inject_scripts + ["echo \"[ZABEL]<INFO> duration = $[ `date +%s` - $startTime_s ] s in stage #{STAGE_EXTRACT}\""]).flatten
|
850
|
-
inject_phase.shell_script = inject_scripts.join("\n")
|
851
|
-
inject_project.save
|
852
|
-
end
|
853
808
|
|
854
809
|
puts "[ZABEL]<INFO> total #{hit_count + miss_count} hit #{hit_count} miss #{miss_count} iteration #{iteration_count}"
|
855
810
|
|
data/lib/zabel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zabel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dengweijun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xcodeproj
|