diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE
new file mode 100644
index 0000000..f6930b1
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE
@@ -0,0 +1,10 @@
+Thanks for your feedback!
+
+If it's a bug:
+
+- What's your environment:
+ - run ` pod env | egrep 'CocoaPods |Xcode|cocoapods-binary' ` then paste the result here
+- A demo project is helpful:
+ - It will be very helpful if provides a demo project that reproduce the problem. A blank project with cocoapods-binary can be downloaded [here](https://github.com/leavez/cocoapods-binary/files/3086250/BinaryDemo.zip), which can be remodeled to a minimal problematic environment. Attach the demo.zip to the comments.
+
+
diff --git a/.gitignore b/.gitignore
index 1a1f76c..85dd667 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ pkg
.idea/
test/Pods
+test/Gemfile.lock
## Various settings
*.pbxuser
diff --git a/README.md b/README.md
index 01bffc5..e1ba6c7 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,13 @@
-# cocoapods-binary
+
+

[](https://travis-ci.org/leavez/cocoapods-binary)
A CocoaPods plugin to integrate pods in form of prebuilt frameworks, not source code, by adding **just one flag** in podfile. Speed up compiling dramatically.
+Good news: Introduction on cocoapods offical site: [Pre-compiling dependencies](http://guides.cocoapods.org/plugins/pre-compiling-dependencies.html) ( NOTE: This plugin is a community work, not official.)
+
+
## Why
You may wonder why CocoaPods doesn't have a function to integrate libs in form of binaries, if there are dozens or hundreds of pods in your podfile and compile them for a great many times meaninglessly. Too many source code of libs slow down your compile and the response of IDE (e.g. code completion), and then reduce work efficiency, leaving us time to think about the meaning of life.
@@ -55,12 +59,15 @@ end
If you want to disable binary for a specific pod when using `all_binary!`, place a `:binary => false` to it.
+If your `Pods` folder is excluded from git, you may add `keep_source_code_for_prebuilt_frameworks!` in the head of Podfile to speed up pod install, as it won't download all the sources every time prebuilt pods have changes.
+
If bitcode is needed, add a `enable_bitcode_for_prebuilt_frameworks!` before all targets in Podfile
+
#### Known Issues
- doesn't support watchos now
-- dSYM files is missing for dynamic frameworks using this plugin. Walkaround: Don't use this plugin for a release build. Add a if condition with ENV around `plugin 'cocoapods-binary'`
+- ~~dSYM files is missing for dynamic frameworks using this plugin. Workaround: Don't use this plugin for a release build. Add a if condition with ENV around `plugin 'cocoapods-binary'`. [(detail)](https://github.com/leavez/cocoapods-binary/issues/44)~~ (fix in 0.4.2)
## License
diff --git a/cocoapods-binary.gemspec b/cocoapods-binary.gemspec
index b575657..697aeb2 100644
--- a/cocoapods-binary.gemspec
+++ b/cocoapods-binary.gemspec
@@ -13,13 +13,14 @@ Gem::Specification.new do |spec|
spec.homepage = 'https://github.com/leavez/cocoapods-binary'
spec.license = 'MIT'
- spec.files = `git ls-files`.split($/).reject{|f| f.start_with? "test/"}
+ spec.files = `git ls-files`.split($/).reject{|f| f.start_with?("test/") || f.start_with?('demo/')}
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ['lib']
spec.add_dependency "cocoapods", ">= 1.5.0", "< 2.0"
spec.add_dependency "fourflusher", "~> 2.0"
+ spec.add_dependency "xcpretty", "~> 0.3.0"
spec.add_development_dependency 'bundler', '~> 1.3'
spec.add_development_dependency 'rake'
diff --git a/demo/.bundle/config b/demo/.bundle/config
new file mode 100644
index 0000000..75a2fe5
--- /dev/null
+++ b/demo/.bundle/config
@@ -0,0 +1,2 @@
+---
+BUNDLE_PATH: "./.bundler_cache"
diff --git a/demo/.gitignore b/demo/.gitignore
new file mode 100644
index 0000000..7873b65
--- /dev/null
+++ b/demo/.gitignore
@@ -0,0 +1,50 @@
+
+# Created by https://www.gitignore.io/api/xcode,cocoapods
+# Edit at https://www.gitignore.io/?templates=xcode,cocoapods
+
+### CocoaPods ###
+## CocoaPods GitIgnore Template
+
+# CocoaPods - Only use to conserve bandwidth / Save time on Pushing
+# - Also handy if you have a large number of dependant pods
+# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
+Pods/
+
+### Xcode ###
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+### Xcode Patch ###
+*.xcodeproj/*
+!*.xcodeproj/project.pbxproj
+!*.xcodeproj/xcshareddata/
+!*.xcworkspace/contents.xcworkspacedata
+/*.gcno
+**/xcshareddata/WorkspaceSettings.xcsettings
+
+# End of https://www.gitignore.io/api/xcode,cocoapods
+
+
+# the bundler local cache
+.bundler_cache/
\ No newline at end of file
diff --git a/demo/Gemfile b/demo/Gemfile
new file mode 100644
index 0000000..5a134c1
--- /dev/null
+++ b/demo/Gemfile
@@ -0,0 +1,7 @@
+
+# frozen_string_literal: true
+source "https://rubygems.org"
+
+gem 'cocoapods', '1.6.1'
+gem 'cocoapods-binary', :path => "../"
+gem 'xcpretty'
diff --git a/demo/Gemfile.lock b/demo/Gemfile.lock
new file mode 100644
index 0000000..054eec4
--- /dev/null
+++ b/demo/Gemfile.lock
@@ -0,0 +1,89 @@
+PATH
+ remote: ..
+ specs:
+ cocoapods-binary (0.4.4)
+ cocoapods (>= 1.5.0, < 2.0)
+ fourflusher (~> 2.0)
+ xcpretty (~> 0.3.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.0)
+ activesupport (4.2.11.1)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ atomos (0.1.3)
+ claide (1.0.2)
+ cocoapods (1.6.1)
+ activesupport (>= 4.0.2, < 5)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.6.1)
+ cocoapods-deintegrate (>= 1.0.2, < 2.0)
+ cocoapods-downloader (>= 1.2.2, < 2.0)
+ cocoapods-plugins (>= 1.0.0, < 2.0)
+ cocoapods-search (>= 1.0.0, < 2.0)
+ cocoapods-stats (>= 1.0.0, < 2.0)
+ cocoapods-trunk (>= 1.3.1, < 2.0)
+ cocoapods-try (>= 1.1.0, < 2.0)
+ colored2 (~> 3.1)
+ escape (~> 0.0.4)
+ fourflusher (>= 2.2.0, < 3.0)
+ gh_inspector (~> 1.0)
+ molinillo (~> 0.6.6)
+ nap (~> 1.0)
+ ruby-macho (~> 1.4)
+ xcodeproj (>= 1.8.1, < 2.0)
+ cocoapods-core (1.6.1)
+ activesupport (>= 4.0.2, < 6)
+ fuzzy_match (~> 2.0.4)
+ nap (~> 1.0)
+ cocoapods-deintegrate (1.0.4)
+ cocoapods-downloader (1.2.2)
+ cocoapods-plugins (1.0.0)
+ nap
+ cocoapods-search (1.0.0)
+ cocoapods-stats (1.1.0)
+ cocoapods-trunk (1.3.1)
+ nap (>= 0.8, < 2.0)
+ netrc (~> 0.11)
+ cocoapods-try (1.1.0)
+ colored2 (3.1.2)
+ concurrent-ruby (1.1.5)
+ escape (0.0.4)
+ fourflusher (2.2.0)
+ fuzzy_match (2.0.4)
+ gh_inspector (1.1.3)
+ i18n (0.9.5)
+ concurrent-ruby (~> 1.0)
+ minitest (5.11.3)
+ molinillo (0.6.6)
+ nanaimo (0.2.6)
+ nap (1.1.0)
+ netrc (0.11.0)
+ rouge (2.0.7)
+ ruby-macho (1.4.0)
+ thread_safe (0.3.6)
+ tzinfo (1.2.5)
+ thread_safe (~> 0.1)
+ xcodeproj (1.8.2)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.2.6)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ cocoapods (= 1.6.1)
+ cocoapods-binary!
+ xcpretty
+
+BUNDLED WITH
+ 2.0.1
diff --git a/demo/Podfile b/demo/Podfile
new file mode 100644
index 0000000..e91f600
--- /dev/null
+++ b/demo/Podfile
@@ -0,0 +1,12 @@
+platform :ios, '9.0'
+plugin 'cocoapods-binary'
+
+use_frameworks!
+all_binary!
+
+
+target 'demo' do
+
+ pod 'Masonry'
+
+end
diff --git a/demo/Podfile.lock b/demo/Podfile.lock
new file mode 100644
index 0000000..abaf4d6
--- /dev/null
+++ b/demo/Podfile.lock
@@ -0,0 +1,16 @@
+PODS:
+ - Masonry (1.1.0)
+
+DEPENDENCIES:
+ - Masonry
+
+SPEC REPOS:
+ https://github.com/cocoapods/specs.git:
+ - Masonry
+
+SPEC CHECKSUMS:
+ Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
+
+PODFILE CHECKSUM: 5daab9dbab4736d6a1b3df2ffa8d856285c16553
+
+COCOAPODS: 1.6.1
diff --git a/demo/demo.xcodeproj/project.pbxproj b/demo/demo.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..556833b
--- /dev/null
+++ b/demo/demo.xcodeproj/project.pbxproj
@@ -0,0 +1,417 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2E1AEA2ADE0B2C6D0E8CB73C /* BDWebImage_demo.m in Sources */ = {isa = PBXBuildFile; fileRef = 89A7B09D8E1B9A5928206B3D /* BDWebImage_demo.m */; };
+ 7ADC04F6B6AD86B4711FC662 /* Pods_demo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0282097ED33E34DF2FB40193 /* Pods_demo.framework */; };
+ 8BC2E4C8225F2B8600EC0609 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC2E4C7225F2B8600EC0609 /* AppDelegate.swift */; };
+ 8BC2E4CA225F2B8600EC0609 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC2E4C9225F2B8600EC0609 /* ViewController.swift */; };
+ 8BC2E4D2225F2B8700EC0609 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8BC2E4D0225F2B8700EC0609 /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 0282097ED33E34DF2FB40193 /* Pods_demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 6F9AD13F2ED88EAB7A9128D7 /* libPods-demoTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-demoTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 89A7B09D8E1B9A5928206B3D /* BDWebImage_demo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = BDWebImage_demo.m; sourceTree = ""; };
+ 8BC2E4C4225F2B8600EC0609 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8BC2E4C7225F2B8600EC0609 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 8BC2E4C9225F2B8600EC0609 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ 8BC2E4D1225F2B8700EC0609 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 8BC2E4D3225F2B8700EC0609 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 9A8064F1F3E5738D234C80E2 /* Pods-demoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demoTests.release.xcconfig"; path = "Target Support Files/Pods-demoTests/Pods-demoTests.release.xcconfig"; sourceTree = ""; };
+ C55F7BF03CC970F91505F490 /* Pods-demoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demoTests.debug.xcconfig"; path = "Target Support Files/Pods-demoTests/Pods-demoTests.debug.xcconfig"; sourceTree = ""; };
+ E9C2707150376AA5D63E8BAE /* Pods-demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo.release.xcconfig"; path = "Target Support Files/Pods-demo/Pods-demo.release.xcconfig"; sourceTree = ""; };
+ F8A8B289BFEAE54B0D540472 /* Pods-demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo.debug.xcconfig"; path = "Target Support Files/Pods-demo/Pods-demo.debug.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8BC2E4C1225F2B8600EC0609 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7ADC04F6B6AD86B4711FC662 /* Pods_demo.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 03BCE6F733E8AF8755385CE8 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 6F9AD13F2ED88EAB7A9128D7 /* libPods-demoTests.a */,
+ 0282097ED33E34DF2FB40193 /* Pods_demo.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 48064E0CABFB2B206E032E3B /* demos */ = {
+ isa = PBXGroup;
+ children = (
+ 89A7B09D8E1B9A5928206B3D /* BDWebImage_demo.m */,
+ );
+ name = demos;
+ path = ./demos;
+ sourceTree = "";
+ };
+ 8BC2E4BB225F2B8600EC0609 = {
+ isa = PBXGroup;
+ children = (
+ 8BC2E4C6225F2B8600EC0609 /* demo */,
+ 8BC2E4C5225F2B8600EC0609 /* Products */,
+ D25B1A678978B02ABFF01D1C /* Pods */,
+ 03BCE6F733E8AF8755385CE8 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 8BC2E4C5225F2B8600EC0609 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8BC2E4C4225F2B8600EC0609 /* demo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 8BC2E4C6225F2B8600EC0609 /* demo */ = {
+ isa = PBXGroup;
+ children = (
+ 8BC2E4C7225F2B8600EC0609 /* AppDelegate.swift */,
+ 8BC2E4C9225F2B8600EC0609 /* ViewController.swift */,
+ 8BC2E4D0225F2B8700EC0609 /* LaunchScreen.storyboard */,
+ 8BC2E4D3225F2B8700EC0609 /* Info.plist */,
+ 48064E0CABFB2B206E032E3B /* demos */,
+ );
+ path = demo;
+ sourceTree = "";
+ };
+ D25B1A678978B02ABFF01D1C /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ F8A8B289BFEAE54B0D540472 /* Pods-demo.debug.xcconfig */,
+ E9C2707150376AA5D63E8BAE /* Pods-demo.release.xcconfig */,
+ C55F7BF03CC970F91505F490 /* Pods-demoTests.debug.xcconfig */,
+ 9A8064F1F3E5738D234C80E2 /* Pods-demoTests.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8BC2E4C3225F2B8600EC0609 /* demo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 8BC2E4E1225F2B8800EC0609 /* Build configuration list for PBXNativeTarget "demo" */;
+ buildPhases = (
+ 4A7278B702427200DBDC45CB /* [CP] Check Pods Manifest.lock */,
+ 8BC2E4C0225F2B8600EC0609 /* Sources */,
+ 8BC2E4C1225F2B8600EC0609 /* Frameworks */,
+ 8BC2E4C2225F2B8600EC0609 /* Resources */,
+ 27E132FE722A29856F619A3D /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = demo;
+ productName = demo;
+ productReference = 8BC2E4C4225F2B8600EC0609 /* demo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 8BC2E4BC225F2B8600EC0609 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1020;
+ LastUpgradeCheck = 1020;
+ TargetAttributes = {
+ 8BC2E4C3225F2B8600EC0609 = {
+ CreatedOnToolsVersion = 10.2;
+ };
+ };
+ binary = binary;
+ };
+ buildConfigurationList = 8BC2E4BF225F2B8600EC0609 /* Build configuration list for PBXProject "demo" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 8BC2E4BB225F2B8600EC0609;
+ productRefGroup = 8BC2E4C5225F2B8600EC0609 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8BC2E4C3225F2B8600EC0609 /* demo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8BC2E4C2225F2B8600EC0609 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8BC2E4D2225F2B8700EC0609 /* LaunchScreen.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 27E132FE722A29856F619A3D /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-frameworks.sh",
+ "${PODS_ROOT}/Masonry/Masonry.framework",
+ "${PODS_ROOT}/Masonry/Masonry.framework.dSYM",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry.framework",
+ "${DWARF_DSYM_FOLDER_PATH}/Masonry.framework.dSYM",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 4A7278B702427200DBDC45CB /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-demo-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8BC2E4C0225F2B8600EC0609 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8BC2E4CA225F2B8600EC0609 /* ViewController.swift in Sources */,
+ 8BC2E4C8225F2B8600EC0609 /* AppDelegate.swift in Sources */,
+ 2E1AEA2ADE0B2C6D0E8CB73C /* BDWebImage_demo.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 8BC2E4D0225F2B8700EC0609 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 8BC2E4D1225F2B8700EC0609 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 8BC2E4DF225F2B8800EC0609 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.2;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 8BC2E4E0225F2B8800EC0609 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.2;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 8BC2E4E2225F2B8800EC0609 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = F8A8B289BFEAE54B0D540472 /* Pods-demo.debug.xcconfig */;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = demo/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.demo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 8BC2E4E3225F2B8800EC0609 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = E9C2707150376AA5D63E8BAE /* Pods-demo.release.xcconfig */;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = demo/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.demo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 8BC2E4BF225F2B8600EC0609 /* Build configuration list for PBXProject "demo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8BC2E4DF225F2B8800EC0609 /* Debug */,
+ 8BC2E4E0225F2B8800EC0609 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 8BC2E4E1225F2B8800EC0609 /* Build configuration list for PBXNativeTarget "demo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8BC2E4E2225F2B8800EC0609 /* Debug */,
+ 8BC2E4E3225F2B8800EC0609 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 8BC2E4BC225F2B8600EC0609 /* Project object */;
+}
diff --git a/demo/demo.xcworkspace/contents.xcworkspacedata b/demo/demo.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..b72a852
--- /dev/null
+++ b/demo/demo.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/demo/demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demo/demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/demo/demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/demo/demo/AppDelegate.swift b/demo/demo/AppDelegate.swift
new file mode 100644
index 0000000..936d690
--- /dev/null
+++ b/demo/demo/AppDelegate.swift
@@ -0,0 +1,53 @@
+//
+// AppDelegate.swift
+// demo
+//
+// Created by Leavez on 2019/04/16.
+// Copyright © 2019 binary. All rights reserved.
+//
+
+import UIKit
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ var window: UIWindow?
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+
+ let viewController = ViewController(nibName: nil, bundle: nil)
+ let window = UIWindow(frame: UIScreen.main.bounds)
+ window.rootViewController = viewController
+ self.window = window
+ window.makeKeyAndVisible()
+
+ return true
+ }
+
+ func applicationWillResignActive(_ application: UIApplication) {
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
+ }
+
+ func applicationDidEnterBackground(_ application: UIApplication) {
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ }
+
+ func applicationWillEnterForeground(_ application: UIApplication) {
+ // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
+ }
+
+ func applicationDidBecomeActive(_ application: UIApplication) {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ }
+
+ func applicationWillTerminate(_ application: UIApplication) {
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+ }
+
+
+}
+
diff --git a/demo/demo/Base.lproj/LaunchScreen.storyboard b/demo/demo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..bfa3612
--- /dev/null
+++ b/demo/demo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/demo/Info.plist b/demo/demo/Info.plist
new file mode 100644
index 0000000..4222ac2
--- /dev/null
+++ b/demo/demo/Info.plist
@@ -0,0 +1,43 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/demo/demo/ViewController.swift b/demo/demo/ViewController.swift
new file mode 100644
index 0000000..0595a88
--- /dev/null
+++ b/demo/demo/ViewController.swift
@@ -0,0 +1,21 @@
+//
+// ViewController.swift
+// demo
+//
+// Created by Leavez on 2019/04/16.
+// Copyright © 2019 binary. All rights reserved.
+//
+
+import UIKit
+
+class ViewController: UIViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ view.backgroundColor = .white
+ }
+
+
+}
+
diff --git a/demo/demo/demos/BDWebImage_demo.m b/demo/demo/demos/BDWebImage_demo.m
new file mode 100644
index 0000000..9b3225e
--- /dev/null
+++ b/demo/demo/demos/BDWebImage_demo.m
@@ -0,0 +1,16 @@
+
+// this is a demo for usage
+#import
+#import
+void masonry_demo() {
+
+ UIView *parent_view = [UIView new];
+ UIView *view1 = [UIView new];
+ [parent_view addSubview:view1];
+
+ [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
+ make.edges.mas_equalTo(0);
+ }];
+}
+
+
diff --git a/lib/cocoapods-binary/Integration.rb b/lib/cocoapods-binary/Integration.rb
index 9bd36f1..8ef76e1 100644
--- a/lib/cocoapods-binary/Integration.rb
+++ b/lib/cocoapods-binary/Integration.rb
@@ -2,6 +2,8 @@
require_relative 'helper/feature_switches'
require_relative 'helper/prebuild_sandbox'
require_relative 'helper/passer'
+require_relative 'helper/names'
+require_relative 'helper/target_checker'
# NOTE:
@@ -24,14 +26,11 @@ def install_for_prebuild!(standard_sanbox)
# make a symlink to target folder
prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(standard_sanbox)
- real_file_folder = prebuild_sandbox.framework_folder_path_for_pod_name(self.name)
-
- target_folder = standard_sanbox.pod_dir(self.name)
- target_folder.rmtree if target_folder.exist?
- target_folder.mkdir
-
- # make a relatvie symbol link for all children
+ # if spec used in multiple platforms, it may return multiple paths
+ target_names = prebuild_sandbox.existed_target_names_for_pod_name(self.name)
+
def walk(path, &action)
+ return unless path.exist?
path.children.each do |child|
result = action.call(child, &action)
if child.directory?
@@ -50,31 +49,51 @@ def mirror_with_symlink(source, basefolder, target_folder)
target = target_folder + source.relative_path_from(basefolder)
make_link(source, target)
end
-
- # symbol link copy all substructure
- walk(real_file_folder) do |child|
- source = child
- # only make symlink to file and `.framework` folder
- if child.directory? and child.extname == ".framework"
- mirror_with_symlink(source, real_file_folder, target_folder)
- next false # return false means don't go deeper
- elsif child.file?
- mirror_with_symlink(source, real_file_folder, target_folder)
- next true
- else
- next true
+
+ target_names.each do |name|
+
+ # symbol link copy all substructure
+ real_file_folder = prebuild_sandbox.framework_folder_path_for_target_name(name)
+
+ # If have only one platform, just place int the root folder of this pod.
+ # If have multiple paths, we use a sperated folder to store different
+ # platform frameworks. e.g. AFNetworking/AFNetworking-iOS/AFNetworking.framework
+
+ target_folder = standard_sanbox.pod_dir(self.name)
+ if target_names.count > 1
+ target_folder += real_file_folder.basename
+ end
+ target_folder.rmtree if target_folder.exist?
+ target_folder.mkpath
+
+
+ walk(real_file_folder) do |child|
+ source = child
+ # only make symlink to file and `.framework` folder
+ if child.directory? and [".framework", ".dSYM"].include? child.extname
+ mirror_with_symlink(source, real_file_folder, target_folder)
+ next false # return false means don't go deeper
+ elsif child.file?
+ mirror_with_symlink(source, real_file_folder, target_folder)
+ next true
+ else
+ next true
+ end
end
- end
- # symbol link copy resource for static framework
- hash = Prebuild::Passer.resources_to_copy_for_static_framework || {}
- path_objects = hash[self.name]
- if path_objects != nil
- path_objects.each do |object|
- make_link(object.real_file_path, object.target_file_path)
+
+ # symbol link copy resource for static framework
+ hash = Prebuild::Passer.resources_to_copy_for_static_framework || {}
+
+ path_objects = hash[name]
+ if path_objects != nil
+ path_objects.each do |object|
+ make_link(object.real_file_path, object.target_file_path)
+ end
end
- end
- end
+ end # of for each
+
+ end # of method
end
end
@@ -95,7 +114,7 @@ def remove_target_files_if_needed
changes = Pod::Prebuild::Passer.prebuild_pods_changes
updated_names = []
if changes == nil
- updated_names = PrebuildSandbox.from_standard_sandbox(self.sandbox).exsited_framework_names
+ updated_names = PrebuildSandbox.from_standard_sandbox(self.sandbox).exsited_framework_pod_names
else
added = changes.added
changed = changes.changed
@@ -127,16 +146,37 @@ def remove_target_files_if_needed
# call original
old_method2.bind(self).()
+ # ...
+ # ...
+ # ...
+ # after finishing the very complex orginal function
+ # check the pods
+ # Although we have did it in prebuild stage, it's not sufficient.
+ # Same pod may appear in another target in form of source code.
+ # Prebuild.check_one_pod_should_have_only_one_target(self.prebuild_pod_targets)
+ self.validate_every_pod_only_have_one_form
- # check the prebuilt targets
- targets = self.prebuild_pod_targets
- targets_have_different_platforms = targets.select {|t| t.pod_name != t.name }
+
+ # prepare
+ cache = []
- if targets_have_different_platforms.count > 0
- names = targets_have_different_platforms.map(&:pod_name)
- STDERR.puts "[!] Binary doesn't support pods who integrate in 2 or more platforms simultaneously: #{names}".red
- exit
+ def add_vendered_framework(spec, platform, added_framework_file_path)
+ if spec.attributes_hash[platform] == nil
+ spec.attributes_hash[platform] = {}
+ end
+ vendored_frameworks = spec.attributes_hash[platform]["vendored_frameworks"] || []
+ vendored_frameworks = [vendored_frameworks] if vendored_frameworks.kind_of?(String)
+ vendored_frameworks += [added_framework_file_path]
+ spec.attributes_hash[platform]["vendored_frameworks"] = vendored_frameworks
+ end
+ def empty_source_files(spec)
+ spec.attributes_hash["source_files"] = []
+ ["ios", "watchos", "tvos", "osx"].each do |plat|
+ if spec.attributes_hash[plat] != nil
+ spec.attributes_hash[plat]["source_files"] = []
+ end
+ end
end
@@ -144,31 +184,41 @@ def remove_target_files_if_needed
prebuilt_specs = (specs.select do |spec|
self.prebuild_pod_names.include? spec.root.name
end)
-
- # make sturcture to fast get target by name
- name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
- sum[target.name] = target
- sum
- end
prebuilt_specs.each do |spec|
- # `spec` may be a subspec, so we use the root's name
- root_name = spec.root.name
-
- target = name_to_target_hash[root_name]
- next if Prebuild::Passer.target_names_to_skip_integration_framework.include? target.pod_name
- # use the prebuilt framework
- original_vendored_frameworks = spec.attributes_hash["vendored_frameworks"] || []
- if original_vendored_frameworks.kind_of?(String)
- original_vendored_frameworks = [original_vendored_frameworks]
+ # Use the prebuild framworks as vendered frameworks
+ # get_corresponding_targets
+ targets = Pod.fast_get_targets_for_pod_name(spec.root.name, self.pod_targets, cache)
+ targets.each do |target|
+ # the framework_file_path rule is decided when `install_for_prebuild`,
+ # as to compitable with older version and be less wordy.
+ framework_file_path = target.framework_name
+ framework_file_path = target.name + "/" + framework_file_path if targets.count > 1
+ add_vendered_framework(spec, target.platform.name.to_s, framework_file_path)
+ end
+ # Clean the source files
+ # we just add the prebuilt framework to specific platform and set no source files
+ # for all platform, so it doesn't support the sence that 'a pod perbuild for one
+ # platform and not for another platform.'
+ empty_source_files(spec)
+
+ # to remove the resurce bundle target.
+ # When specify the "resource_bundles" in podspec, xcode will generate a bundle
+ # target after pod install. But the bundle have already built when the prebuit
+ # phase and saved in the framework folder. We will treat it as a normal resource
+ # file.
+ # https://github.com/leavez/cocoapods-binary/issues/29
+ if spec.attributes_hash["resource_bundles"]
+ bundle_names = spec.attributes_hash["resource_bundles"].keys
+ spec.attributes_hash["resource_bundles"] = nil
+ spec.attributes_hash["resources"] ||= []
+ spec.attributes_hash["resources"] += bundle_names.map{|n| n+".bundle"}
end
- original_vendored_frameworks += [target.framework_name]
- spec.attributes_hash["vendored_frameworks"] = original_vendored_frameworks
- spec.attributes_hash["source_files"] = []
# to avoid the warning of missing license
- spec.attributes_hash["license"] = {}
+ spec.attributes_hash["license"] = {}
+
end
end
@@ -217,8 +267,9 @@ class EmbedFrameworksScript
# ---- this is added by cocoapods-binary ---
# Readlink cannot handle relative symlink well, so we override it to a new one
# If the path isn't an absolute path, we add a realtive prefix.
+ old_read_link=`which readlink`
readlink () {
- path=`/usr/bin/readlink $1`;
+ path=`$old_read_link "$1"`;
if [ $(echo "$path" | cut -c 1-1) = '/' ]; then
echo $path;
else
@@ -227,6 +278,10 @@ class EmbedFrameworksScript
}
# ---
SH
+
+ # patch the rsync for copy dSYM symlink
+ script = script.gsub "rsync --delete", "rsync --copy-links --delete"
+
patch + script
end
end
diff --git a/lib/cocoapods-binary/Main.rb b/lib/cocoapods-binary/Main.rb
index 1903382..78fcf41 100644
--- a/lib/cocoapods-binary/Main.rb
+++ b/lib/cocoapods-binary/Main.rb
@@ -17,12 +17,58 @@ def enable_bitcode_for_prebuilt_frameworks!
DSL.bitcode_enabled = true
end
+ # Don't remove source code of prebuilt pods
+ # It may speed up the pod install if git didn't
+ # include the `Pods` folder
+ def keep_source_code_for_prebuilt_frameworks!
+ DSL.dont_remove_source_code = true
+ end
+
+ # Add custom xcodebuild option to the prebuilding action
+ #
+ # You may use this for your special demands. For example: the default archs in dSYMs
+ # of prebuilt frameworks is 'arm64 armv7 x86_64', and no 'i386' for 32bit simulator.
+ # It may generate a warning when building for a 32bit simulator. You may add following
+ # to your podfile
+ #
+ # ` set_custom_xcodebuild_options_for_prebuilt_frameworks :simulator => "ARCHS=$(ARCHS_STANDARD)" `
+ #
+ # Another example to disable the generating of dSYM file:
+ #
+ # ` set_custom_xcodebuild_options_for_prebuilt_frameworks "DEBUG_INFORMATION_FORMAT=dwarf"`
+ #
+ #
+ # @param [String or Hash] options
+ #
+ # If is a String, it will apply for device and simulator. Use it just like in the commandline.
+ # If is a Hash, it should be like this: { :device => "XXXXX", :simulator => "XXXXX" }
+ #
+ def set_custom_xcodebuild_options_for_prebuilt_frameworks(options)
+ if options.kind_of? Hash
+ DSL.custom_build_options = [ options[:device] ] unless options[:device].nil?
+ DSL.custom_build_options_simulator = [ options[:simulator] ] unless options[:simulator].nil?
+ elsif options.kind_of? String
+ DSL.custom_build_options = [options]
+ DSL.custom_build_options_simulator = [options]
+ else
+ raise "Wrong type."
+ end
+ end
+
private
class_attr_accessor :prebuild_all
prebuild_all = false
class_attr_accessor :bitcode_enabled
bitcode_enabled = false
+
+ class_attr_accessor :dont_remove_source_code
+ dont_remove_source_code = false
+
+ class_attr_accessor :custom_build_options
+ class_attr_accessor :custom_build_options_simulator
+ self.custom_build_options = []
+ self.custom_build_options_simulator = []
end
end
end
@@ -38,7 +84,7 @@ def enable_bitcode_for_prebuilt_frameworks!
# check user_framework is on
podfile = installer_context.podfile
podfile.target_definition_list.each do |target_definition|
- next if target_definition.prebuild_framework_names.empty?
+ next if target_definition.prebuild_framework_pod_names.empty?
if not target_definition.uses_frameworks?
STDERR.puts "[!] Cocoapods-binary requires `use_frameworks!`".red
exit
@@ -54,6 +100,18 @@ def enable_bitcode_for_prebuilt_frameworks!
Pod::UI.puts "🚀 Prebuild frameworks"
+ # Fetch original installer (which is running this pre-install hook) options,
+ # then pass them to our installer to perform update if needed
+ # Looks like this is the most appropriate way to figure out that something should be updated
+
+ update = nil
+ repo_update = nil
+
+ include ObjectSpace
+ ObjectSpace.each_object(Pod::Installer) { |installer|
+ update = installer.update
+ repo_update = installer.repo_update
+ }
# control features
Pod.is_prebuild_stage = true
@@ -70,13 +128,14 @@ def enable_bitcode_for_prebuilt_frameworks!
prebuild_podfile = Pod::Podfile.from_ruby(podfile.defined_in_file)
# install
- binary_installer = Pod::Installer.new(prebuild_sandbox, prebuild_podfile , nil)
+ lockfile = installer_context.lockfile
+ binary_installer = Pod::Installer.new(prebuild_sandbox, prebuild_podfile, lockfile)
- if binary_installer.have_exact_prebuild_cache?
+ if binary_installer.have_exact_prebuild_cache? && !update
binary_installer.install_when_cache_hit!
else
- binary_installer.repo_update = false
- binary_installer.update = false
+ binary_installer.update = update
+ binary_installer.repo_update = repo_update
binary_installer.install!
end
@@ -87,6 +146,7 @@ def enable_bitcode_for_prebuilt_frameworks!
Pod::Podfile::DSL.enable_prebuild_patch false
Pod::Config.force_disable_write_lockfile false
Pod::Installer.disable_install_complete_message false
+ Pod::UserInterface.warnings = [] # clean the warning in the prebuild step, it's duplicated.
# -- step 2: pod install ---
diff --git a/lib/cocoapods-binary/Prebuild.rb b/lib/cocoapods-binary/Prebuild.rb
index 5b99b55..77bc834 100644
--- a/lib/cocoapods-binary/Prebuild.rb
+++ b/lib/cocoapods-binary/Prebuild.rb
@@ -1,5 +1,7 @@
require_relative 'rome/build_framework'
require_relative 'helper/passer'
+require_relative 'helper/target_checker'
+
# patch prebuild ability
module Pod
@@ -43,11 +45,9 @@ def have_exact_prebuild_cache?
unchanged = changes.unchanged
deleted = changes.deleted
- unchange_framework_names = (added + unchanged)
-
- exsited_framework_names = sandbox.exsited_framework_names
+ exsited_framework_pod_names = sandbox.exsited_framework_pod_names
missing = unchanged.select do |pod_name|
- not exsited_framework_names.include?(pod_name)
+ not exsited_framework_pod_names.include?(pod_name)
end
needed = (added + changed + deleted + missing)
@@ -58,7 +58,7 @@ def have_exact_prebuild_cache?
# The install method when have completed cache
def install_when_cache_hit!
# just print log
- self.sandbox.exsited_framework_names.each do |name|
+ self.sandbox.exsited_framework_target_names.each do |name|
UI.puts "Using #{name}"
end
end
@@ -82,35 +82,25 @@ def prebuild_frameworks!
deleted = changes.deleted
existed_framework_folder.mkdir unless existed_framework_folder.exist?
- exsited_framework_names = sandbox.exsited_framework_names
-
- # deletions
- # remove all frameworks except ones to remain
- unchange_framework_names = (added + unchanged)
- to_delete = exsited_framework_names.select do |framework_name|
- not unchange_framework_names.include?(framework_name)
- end
- to_delete.each do |framework_name|
- path = sandbox.framework_folder_path_for_pod_name(framework_name)
- path.rmtree if path.exist?
- end
+ exsited_framework_pod_names = sandbox.exsited_framework_pod_names
# additions
missing = unchanged.select do |pod_name|
- not exsited_framework_names.include?(pod_name)
+ not exsited_framework_pod_names.include?(pod_name)
end
root_names_to_update = (added + changed + missing)
# transform names to targets
- name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
- sum[target.name] = target
- sum
- end
- targets = root_names_to_update.map do |root_name|
- name_to_target_hash[root_name]
- end || []
+ cache = []
+ targets = root_names_to_update.map do |pod_name|
+ tars = Pod.fast_get_targets_for_pod_name(pod_name, self.pod_targets, cache)
+ if tars.nil? || tars.empty?
+ raise "There's no target named (#{pod_name}) in Pod.xcodeproj.\n #{self.pod_targets.map(&:name)}" if t.nil?
+ end
+ tars
+ end.flatten
# add the dendencies
dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
@@ -122,29 +112,46 @@ def prebuild_frameworks!
targets = targets.reject {|pod_target| sandbox.local?(pod_target.pod_name) }
-
# build!
Pod::UI.puts "Prebuild frameworks (total #{targets.count})"
Pod::Prebuild.remove_build_dir(sandbox_path)
targets.each do |target|
- next unless target.should_build?
+ if !target.should_build?
+ UI.puts "Prebuilding #{target.label}"
+ next
+ end
- output_path = sandbox.framework_folder_path_for_pod_name(target.name)
+ output_path = sandbox.framework_folder_path_for_target_name(target.name)
output_path.mkpath unless output_path.exist?
- Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled)
+ Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled, Podfile::DSL.custom_build_options, Podfile::DSL.custom_build_options_simulator)
# save the resource paths for later installing
if target.static_framework? and !target.resource_paths.empty?
framework_path = output_path + target.framework_name
standard_sandbox_path = sandbox.standard_sanbox_path
- path_objects = target.resource_paths.select{|f| f.start_with? "${PODS_ROOT}"}.map do |path|
+
+ resources = begin
+ if Pod::VERSION.start_with? "1.5"
+ target.resource_paths
+ else
+ # resource_paths is Hash{String=>Array} on 1.6 and above
+ # (use AFNetworking to generate a demo data)
+ # https://github.com/leavez/cocoapods-binary/issues/50
+ target.resource_paths.values.flatten
+ end
+ end
+ raise "Wrong type: #{resources}" unless resources.kind_of? Array
+
+ path_objects = resources.map do |path|
object = Prebuild::Passer::ResourcePath.new
object.real_file_path = framework_path + File.basename(path)
- object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s)
+ object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s) if path.start_with? '${PODS_ROOT}'
+ object.target_file_path = path.gsub("${PODS_CONFIGURATION_BUILD_DIR}", standard_sandbox_path.to_s) if path.start_with? "${PODS_CONFIGURATION_BUILD_DIR}"
object
end
Prebuild::Passer.resources_to_copy_for_static_framework[target.name] = path_objects
end
+
end
Pod::Prebuild.remove_build_dir(sandbox_path)
@@ -152,12 +159,12 @@ def prebuild_frameworks!
# copy vendored libraries and frameworks
targets.each do |target|
root_path = self.sandbox.pod_dir(target.name)
- target_folder = sandbox.framework_folder_path_for_pod_name(target.name)
+ target_folder = sandbox.framework_folder_path_for_target_name(target.name)
# If target shouldn't build, we copy all the original files
# This is for target with only .a and .h files
if not target.should_build?
- Prebuild::Passer.target_names_to_skip_integration_framework << target.pod_name
+ Prebuild::Passer.target_names_to_skip_integration_framework << target.name
FileUtils.cp_r(root_path, target_folder, :remove_destination => true)
next
end
@@ -175,18 +182,41 @@ def prebuild_frameworks!
end
end
end
+
+ # save the pod_name for prebuild framwork in sandbox
+ targets.each do |target|
+ sandbox.save_pod_name_for_target target
+ end
# Remove useless files
- # only keep manifest.lock and framework folder
- to_remain_files = ["Manifest.lock", File.basename(existed_framework_folder)]
- to_delete_files = sandbox_path.children.select do |file|
- filename = File.basename(file)
- not to_remain_files.include?(filename)
+ # remove useless pods
+ all_needed_names = self.pod_targets.map(&:name).uniq
+ useless_target_names = sandbox.exsited_framework_target_names.reject do |name|
+ all_needed_names.include? name
end
- to_delete_files.each do |path|
+ useless_target_names.each do |name|
+ path = sandbox.framework_folder_path_for_target_name(name)
path.rmtree if path.exist?
end
+ if not Podfile::DSL.dont_remove_source_code
+ # only keep manifest.lock and framework folder in _Prebuild
+ to_remain_files = ["Manifest.lock", File.basename(existed_framework_folder)]
+ to_delete_files = sandbox_path.children.select do |file|
+ filename = File.basename(file)
+ not to_remain_files.include?(filename)
+ end
+ to_delete_files.each do |path|
+ path.rmtree if path.exist?
+ end
+ else
+ # just remove the tmp files
+ path = sandbox.root + 'Manifest.lock.tmp'
+ path.rmtree if path.exist?
+ end
+
+
+
end
diff --git a/lib/cocoapods-binary/gem_version.rb b/lib/cocoapods-binary/gem_version.rb
index b987cd0..fd912f8 100644
--- a/lib/cocoapods-binary/gem_version.rb
+++ b/lib/cocoapods-binary/gem_version.rb
@@ -1,3 +1,3 @@
module CocoapodsBinary
- VERSION = "0.3.6"
+ VERSION = "0.4.4"
end
diff --git a/lib/cocoapods-binary/helper/feature_switches.rb b/lib/cocoapods-binary/helper/feature_switches.rb
index 643b7bb..388ef8c 100644
--- a/lib/cocoapods-binary/helper/feature_switches.rb
+++ b/lib/cocoapods-binary/helper/feature_switches.rb
@@ -38,11 +38,6 @@ def self.enable_prebuild_patch(value)
end
if should_prebuild and (not local)
- if current_target_definition.platform == :watchos
- # watchos isn't supported currently
- Pod::UI.warn "Binary doesn't support watchos currently: #{name}. You can manually set `binary => false` for this pod to suppress this warning."
- return
- end
old_method.bind(self).(name, *args)
end
end
diff --git a/lib/cocoapods-binary/helper/names.rb b/lib/cocoapods-binary/helper/names.rb
new file mode 100644
index 0000000..e6ec3ea
--- /dev/null
+++ b/lib/cocoapods-binary/helper/names.rb
@@ -0,0 +1,78 @@
+# ABOUT NAMES
+#
+# There are many kinds of name in cocoapods. Two main names are widely used in this plugin.
+# - root_spec.name (spec.root_name, targe.pod_name):
+# aka "pod_name"
+# the name we use in podfile. the concept.
+#
+# - target.name:
+# aka "target_name"
+# the name of the final target in xcode project. the final real thing.
+#
+# One pod may have multiple targets in xcode project, due to one pod can be used in mutiple
+# platform simultaneously. So one `root_spec.name` may have multiple coresponding `target.name`s.
+# Therefore, map a spec to/from targets is a little complecated. It's one to many.
+#
+
+# Tool to transform Pod_name to target efficiently
+module Pod
+ def self.fast_get_targets_for_pod_name(pod_name, targets, cache)
+ pod_name_to_targets_hash = nil
+ if cache.empty?
+ pod_name_to_targets_hash = targets.reduce({}) do |sum, target|
+ array = sum[target.pod_name] || []
+ array << target
+ sum[target.pod_name] = array
+ sum
+ end
+ cache << pod_name_to_targets_hash
+ else
+ pod_name_to_targets_hash = cache.first
+ end
+
+ pod_name_to_targets_hash[pod_name] || []
+ end
+end
+
+
+
+
+
+
+# Target:
+
+# def pod_name
+# root_spec.name
+# end
+
+# def name
+# pod_name + #{scope_suffix}
+# end
+
+# def product_module_name
+# root_spec.module_name
+# end
+
+# def framework_name
+# "#{product_module_name}.framework"
+# end
+
+# def product_name
+# if requires_frameworks?
+# framework_name
+# else
+# static_library_name
+# end
+# end
+
+# def product_basename
+# if requires_frameworks?
+# product_module_name
+# else
+# label
+# end
+# end
+
+# def framework_name
+# "#{product_module_name}.framework"
+# end
\ No newline at end of file
diff --git a/lib/cocoapods-binary/helper/podfile_options.rb b/lib/cocoapods-binary/helper/podfile_options.rb
index 596ae61..ebbc402 100644
--- a/lib/cocoapods-binary/helper/podfile_options.rb
+++ b/lib/cocoapods-binary/helper/podfile_options.rb
@@ -11,40 +11,40 @@ class TargetDefinition
## --- option for setting using prebuild framework ---
def parse_prebuild_framework(name, requirements)
+ should_prebuild = Pod::Podfile::DSL.prebuild_all
+
options = requirements.last
- return requirements unless options.is_a?(Hash)
+ if options.is_a?(Hash) && options[Pod::Prebuild.keyword] != nil
+ should_prebuild = options.delete(Pod::Prebuild.keyword)
+ requirements.pop if options.empty?
+ end
- should_prebuild_framework = options.delete(Pod::Prebuild.keyword)
pod_name = Specification.root_name(name)
- set_prebuild_for_pod(pod_name, should_prebuild_framework)
- requirements.pop if options.empty?
+ set_prebuild_for_pod(pod_name, should_prebuild)
end
def set_prebuild_for_pod(pod_name, should_prebuild)
if should_prebuild == true
- # watchos isn't supported currently
- return if self.platform == :watchos
-
- @prebuild_framework_names ||= []
- @prebuild_framework_names.push pod_name
+ @prebuild_framework_pod_names ||= []
+ @prebuild_framework_pod_names.push pod_name
else
- @should_not_prebuild_framework_names ||= []
- @should_not_prebuild_framework_names.push pod_name
+ @should_not_prebuild_framework_pod_names ||= []
+ @should_not_prebuild_framework_pod_names.push pod_name
end
end
- def prebuild_framework_names
- names = @prebuild_framework_names || []
+ def prebuild_framework_pod_names
+ names = @prebuild_framework_pod_names || []
if parent != nil and parent.kind_of? TargetDefinition
- names += parent.prebuild_framework_names
+ names += parent.prebuild_framework_pod_names
end
names
end
- def should_not_prebuild_framework_names
- names = @should_not_prebuild_framework_names || []
+ def should_not_prebuild_framework_pod_names
+ names = @should_not_prebuild_framework_pod_names || []
if parent != nil and parent.kind_of? TargetDefinition
- names += parent.should_not_prebuild_framework_names
+ names += parent.should_not_prebuild_framework_pod_names
end
names
end
@@ -68,16 +68,16 @@ module Pod
class Installer
def prebuild_pod_targets
-
+ @prebuild_pod_targets ||= (
all = []
- aggregate_targets = self.aggregate_targets.select { |a| a.platform != :watchos }
+ aggregate_targets = self.aggregate_targets
aggregate_targets.each do |aggregate_target|
target_definition = aggregate_target.target_definition
targets = aggregate_target.pod_targets || []
# filter prebuild
- prebuild_names = target_definition.prebuild_framework_names
+ prebuild_names = target_definition.prebuild_framework_pod_names
if not Podfile::DSL.prebuild_all
targets = targets.select { |pod_target| prebuild_names.include?(pod_target.pod_name) }
end
@@ -85,7 +85,7 @@ def prebuild_pod_targets
targets = (targets + dependency_targets).uniq
# filter should not prebuild
- explict_should_not_names = target_definition.should_not_prebuild_framework_names
+ explict_should_not_names = target_definition.should_not_prebuild_framework_pod_names
targets = targets.reject { |pod_target| explict_should_not_names.include?(pod_target.pod_name) }
all += targets
@@ -93,6 +93,7 @@ def prebuild_pod_targets
all = all.reject {|pod_target| sandbox.local?(pod_target.pod_name) }
all.uniq
+ )
end
# the root names who needs prebuild, including dependency pods.
@@ -100,6 +101,27 @@ def prebuild_pod_names
@prebuild_pod_names ||= self.prebuild_pod_targets.map(&:pod_name)
end
+
+ def validate_every_pod_only_have_one_form
+
+ multi_targets_pods = self.pod_targets.group_by do |t|
+ t.pod_name
+ end.select do |k, v|
+ v.map{|t| t.platform.name }.count > 1
+ end
+
+ multi_targets_pods = multi_targets_pods.reject do |name, targets|
+ contained = targets.map{|t| self.prebuild_pod_targets.include? t }
+ contained.uniq.count == 1 # all equal
+ end
+
+ return if multi_targets_pods.empty?
+
+ warnings = "One pod can only be prebuilt or not prebuilt. These pod have different forms in multiple targets:\n"
+ warnings += multi_targets_pods.map{|name, targets| " #{name}: #{targets.map{|t|t.platform.name}}"}.join("\n")
+ raise Informative, warnings
+ end
+
end
end
diff --git a/lib/cocoapods-binary/helper/prebuild_sandbox.rb b/lib/cocoapods-binary/helper/prebuild_sandbox.rb
index 8bfb14b..cbae242 100644
--- a/lib/cocoapods-binary/helper/prebuild_sandbox.rb
+++ b/lib/cocoapods-binary/helper/prebuild_sandbox.rb
@@ -1,3 +1,5 @@
+require_relative "names"
+
module Pod
class PrebuildSandbox < Sandbox
@@ -19,31 +21,53 @@ def generate_framework_path
self.root + "GeneratedFrameworks"
end
- def framework_folder_path_for_pod_name(name)
+ # @param name [String] pass the target.name (may containing platform suffix)
+ # @return [Pathname] the folder containing the framework file.
+ def framework_folder_path_for_target_name(name)
self.generate_framework_path + name
end
- def exsited_framework_names
- return [] unless generate_framework_path.exist?
- generate_framework_path.children().map do |framework_name|
- if framework_name.directory?
- if not framework_name.children.empty?
- File.basename(framework_name)
- else
- nil
- end
- else
- nil
- end
- end.reject(&:nil?)
+
+ def exsited_framework_target_names
+ exsited_framework_name_pairs.map {|pair| pair[0]}.uniq
+ end
+ def exsited_framework_pod_names
+ exsited_framework_name_pairs.map {|pair| pair[1]}.uniq
+ end
+ def existed_target_names_for_pod_name(pod_name)
+ exsited_framework_name_pairs.select {|pair| pair[1] == pod_name }.map { |pair| pair[0]}
end
- def framework_existed?(root_name)
- return false unless generate_framework_path.exist?
- generate_framework_path.children().any? do |child|
- child.basename.to_s == root_name
+
+
+ def save_pod_name_for_target(target)
+ folder = framework_folder_path_for_target_name(target.name)
+ return unless folder.exist?
+ flag_file_path = folder + "#{target.pod_name}.pod_name"
+ File.write(flag_file_path.to_s, "")
+ end
+
+
+ private
+
+ def pod_name_for_target_folder(target_folder_path)
+ name = Pathname.new(target_folder_path).children.find do |child|
+ child.to_s.end_with? ".pod_name"
end
+ name = name.basename(".pod_name").to_s unless name.nil?
+ name ||= Pathname.new(target_folder_path).basename.to_s # for compatibility with older version
end
+ # Array<[target_name, pod_name]>
+ def exsited_framework_name_pairs
+ return [] unless generate_framework_path.exist?
+ generate_framework_path.children().map do |framework_path|
+ if framework_path.directory? && (not framework_path.children.empty?)
+ [framework_path.basename.to_s, pod_name_for_target_folder(framework_path)]
+ else
+ nil
+ end
+ end.reject(&:nil?).uniq
+ end
end
end
diff --git a/lib/cocoapods-binary/helper/target_checker.rb b/lib/cocoapods-binary/helper/target_checker.rb
new file mode 100644
index 0000000..7d90a1f
--- /dev/null
+++ b/lib/cocoapods-binary/helper/target_checker.rb
@@ -0,0 +1,49 @@
+
+module Pod
+ class Prebuild
+
+ # Check the targets, for the current limitation of the plugin
+ #
+ # @param [Array] prebuilt_targets
+ def self.check_one_pod_should_have_only_one_target(prebuilt_targets)
+
+ targets_have_different_platforms = prebuilt_targets.select {|t| t.pod_name != t.name }
+
+ if targets_have_different_platforms.count > 0
+ names = targets_have_different_platforms.map(&:pod_name)
+ raw_names = targets_have_different_platforms.map(&:name)
+ message = "Oops, you came across a limitation of cocoapods-binary.
+
+The plugin requires that one pod should have ONLY ONE target in the 'Pod.xcodeproj'. There are mainly 2 situations \
+causing this problem:
+
+1. One pod integrates in 2 or more different platforms' targets. e.g.
+ ```
+ target 'iphoneApp' do
+ pod 'A', :binary => true
+ end
+ target 'watchApp' do
+ pod 'A'
+ end
+ ```
+
+2. Use different subspecs in multiple targets. e.g.
+ ```
+ target 'iphoneApp' do
+ pod 'A/core'
+ pod 'A/network'
+ end
+ target 'iphoneAppTest' do
+ pod 'A/core'
+ end
+ ```
+
+Related pods: #{names}, target names: #{raw_names}
+ "
+ raise Informative, message
+ end
+ end
+
+
+ end
+end
\ No newline at end of file
diff --git a/lib/cocoapods-binary/rome/build_framework.rb b/lib/cocoapods-binary/rome/build_framework.rb
index bd45003..10c8571 100644
--- a/lib/cocoapods-binary/rome/build_framework.rb
+++ b/lib/cocoapods-binary/rome/build_framework.rb
@@ -1,4 +1,5 @@
require 'fourflusher'
+require 'xcpretty'
CONFIGURATION = "Release"
PLATFORMS = { 'iphonesimulator' => 'iOS',
@@ -15,38 +16,93 @@ def build_for_iosish_platform(sandbox,
target,
device,
simulator,
- bitcode_enabled)
+ bitcode_enabled,
+ custom_build_options = [], # Array
+ custom_build_options_simulator = [] # Array
+ )
deployment_target = target.platform.deployment_target.to_s
- target_label = target.label
+ target_label = target.label # name with platform if it's used in multiple platforms
Pod::UI.puts "Prebuilding #{target_label}..."
- other_options = []
- if bitcode_enabled
- other_options += ['OTHER_CFLAGS="-fembed-bitcode"']
- end
- xcodebuild(sandbox, target_label, device, deployment_target, other_options)
- xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ['ARCHS=x86_64', 'ONLY_ACTIVE_ARCH=NO'])
-
- root_name = target.pod_name
+ other_options = []
+ # bitcode enabled
+ other_options += ['BITCODE_GENERATION_MODE=bitcode'] if bitcode_enabled
+ # make less arch to iphone simulator for faster build
+ custom_build_options_simulator += ['ARCHS=x86_64', 'ONLY_ACTIVE_ARCH=NO'] if simulator == 'iphonesimulator'
+
+ is_succeed, _ = xcodebuild(sandbox, target_label, device, deployment_target, other_options + custom_build_options)
+ exit 1 unless is_succeed
+ is_succeed, _ = xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + custom_build_options_simulator)
+ exit 1 unless is_succeed
+
+ # paths
+ target_name = target.name # equals target.label, like "AFNeworking-iOS" when AFNetworking is used in multiple platforms.
module_name = target.product_module_name
+ device_framework_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{target_name}/#{module_name}.framework"
+ simulator_framework_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{target_name}/#{module_name}.framework"
+
+ device_binary = device_framework_path + "/#{module_name}"
+ simulator_binary = simulator_framework_path + "/#{module_name}"
+ return unless File.file?(device_binary) && File.file?(simulator_binary)
+
+ # the device_lib path is the final output file path
+ # combine the binaries
+ tmp_lipoed_binary_path = "#{build_dir}/#{target_name}"
+ lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_binary} #{simulator_binary}`
+ puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
+ FileUtils.mv tmp_lipoed_binary_path, device_binary, :force => true
- executable_path = "#{build_dir}/#{root_name}"
- device_lib = "#{build_dir}/#{CONFIGURATION}-#{device}/#{root_name}/#{module_name}.framework/#{module_name}"
- device_framework_lib = File.dirname(device_lib)
- simulator_lib = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{root_name}/#{module_name}.framework/#{module_name}"
+ # collect the swiftmodule file for various archs.
+ device_swiftmodule_path = device_framework_path + "/Modules/#{module_name}.swiftmodule"
+ simulator_swiftmodule_path = simulator_framework_path + "/Modules/#{module_name}.swiftmodule"
+ if File.exist?(device_swiftmodule_path)
+ FileUtils.cp_r simulator_swiftmodule_path + "/.", device_swiftmodule_path
+ end
+
+ # combine the generated swift headers
+ # (In xcode 10.2, the generated swift headers vary for each archs)
+ # https://github.com/leavez/cocoapods-binary/issues/58
+ simulator_generated_swift_header_path = simulator_framework_path + "/Headers/#{module_name}-Swift.h"
+ device_generated_swift_header_path = device_framework_path + "/Headers/#{module_name}-Swift.h"
+ if File.exist? simulator_generated_swift_header_path
+ device_header = File.read(device_generated_swift_header_path)
+ simulator_header = File.read(simulator_generated_swift_header_path)
+ # https://github.com/Carthage/Carthage/issues/2718#issuecomment-473870461
+ combined_header_content = %Q{
+#if TARGET_OS_SIMULATOR // merged by cocoapods-binary
+
+#{simulator_header}
+
+#else // merged by cocoapods-binary
- return unless File.file?(device_lib) && File.file?(simulator_lib)
+#{device_header}
- lipo_log = `lipo -create -output #{executable_path} #{device_lib} #{simulator_lib}`
- puts lipo_log unless File.exist?(executable_path)
+#endif // merged by cocoapods-binary
+}
+ File.write(device_generated_swift_header_path, combined_header_content.strip)
+ end
+
+ # handle the dSYM files
+ device_dsym = "#{device_framework_path}.dSYM"
+ if File.exist? device_dsym
+ # lipo the simulator dsym
+ simulator_dsym = "#{simulator_framework_path}.dSYM"
+ if File.exist? simulator_dsym
+ tmp_lipoed_binary_path = "#{output_path}/#{module_name}.draft"
+ lipo_log = `lipo -create -output #{tmp_lipoed_binary_path} #{device_dsym}/Contents/Resources/DWARF/#{module_name} #{simulator_dsym}/Contents/Resources/DWARF/#{module_name}`
+ puts lipo_log unless File.exist?(tmp_lipoed_binary_path)
+ FileUtils.mv tmp_lipoed_binary_path, "#{device_framework_path}.dSYM/Contents/Resources/DWARF/#{module_name}", :force => true
+ end
+ # move
+ FileUtils.mv device_dsym, output_path, :force => true
+ end
- FileUtils.mv executable_path, device_lib, :force => true
+ # output
output_path.mkpath unless output_path.exist?
- FileUtils.mv device_framework_lib, output_path, :force => true
- FileUtils.rm simulator_lib if File.file?(simulator_lib)
- FileUtils.rm device_lib if File.file?(device_lib)
+ FileUtils.mv device_framework_path, output_path, :force => true
+
end
def xcodebuild(sandbox, target, sdk='macosx', deployment_target=nil, other_options=[])
@@ -54,7 +110,27 @@ def xcodebuild(sandbox, target, sdk='macosx', deployment_target=nil, other_optio
platform = PLATFORMS[sdk]
args += Fourflusher::SimControl.new.destination(:oldest, platform, deployment_target) unless platform.nil?
args += other_options
- Pod::Executable.execute_command 'xcodebuild', args, true
+ log = `xcodebuild #{args.join(" ")} 2>&1`
+ exit_code = $?.exitstatus # Process::Status
+ is_succeed = (exit_code == 0)
+
+ if !is_succeed
+ begin
+ if log.include?('** BUILD FAILED **')
+ # use xcpretty to print build log
+ # 64 represent command invalid. http://www.manpagez.com/man/3/sysexits/
+ printer = XCPretty::Printer.new({:formatter => XCPretty::Simple, :colorize => 'auto'})
+ log.each_line do |line|
+ printer.pretty_print(line)
+ end
+ else
+ raise "shouldn't be handle by xcpretty"
+ end
+ rescue
+ puts log.red
+ end
+ end
+ [is_succeed, log]
end
@@ -73,9 +149,9 @@ class Prebuild
# [Pathname] output_path
# output path for generated frameworks
#
- def self.build(sandbox_root_path, target, output_path, bitcode_enabled = false)
+ def self.build(sandbox_root_path, target, output_path, bitcode_enabled = false, custom_build_options=[], custom_build_options_simulator=[])
- return unless not target == nil
+ return if target.nil?
sandbox_root = Pathname(sandbox_root_path)
sandbox = Pod::Sandbox.new(sandbox_root)
@@ -83,10 +159,10 @@ def self.build(sandbox_root_path, target, output_path, bitcode_enabled = false)
# -- build the framework
case target.platform.name
- when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled)
- when :osx then xcodebuild(sandbox, target.label)
+ when :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled, custom_build_options, custom_build_options_simulator)
+ when :osx then xcodebuild(sandbox, target.label, 'macosx', nil, custom_build_options)
# when :tvos then build_for_iosish_platform(sandbox, build_dir, target, 'appletvos', 'appletvsimulator')
- # when :watchos then build_for_iosish_platform(sandbox, build_dir, target, 'watchos', 'watchsimulator')
+ when :watchos then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'watchos', 'watchsimulator', true, custom_build_options, custom_build_options_simulator)
else raise "Unsupported platform for '#{target.name}': '#{target.platform.name}'" end
raise Pod::Informative, 'The build directory was not found in the expected location.' unless build_dir.directory?
@@ -124,4 +200,3 @@ def self.build_dir(sandbox_root)
end
end
-
diff --git a/test/Binary.xcodeproj/project.pbxproj b/test/Binary.xcodeproj/project.pbxproj
index 500ac27..291e5da 100644
--- a/test/Binary.xcodeproj/project.pbxproj
+++ b/test/Binary.xcodeproj/project.pbxproj
@@ -10,9 +10,59 @@
3E1E218020A0B66900EFA102 /* import.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1E217F20A0B66900EFA102 /* import.swift */; };
3E83E326207BC00E0057855A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E83E325207BC00E0057855A /* AppDelegate.swift */; };
3E83E328207BC00E0057855A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E83E327207BC00E0057855A /* ViewController.swift */; };
+ 3EEAFD8720F1056D009A9D22 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD8520F1056D009A9D22 /* Interface.storyboard */; };
+ 3EEAFD8920F1056D009A9D22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD8820F1056D009A9D22 /* Assets.xcassets */; };
+ 3EEAFD9020F1056E009A9D22 /* BinaryWatch Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 3EEAFD9520F1056E009A9D22 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */; };
+ 3EEAFD9720F1056E009A9D22 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */; };
+ 3EEAFD9920F1056E009A9D22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EEAFD9820F1056E009A9D22 /* Assets.xcassets */; };
+ 3EEAFD9D20F1056E009A9D22 /* BinaryWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */; };
+ 3EEAFDA720F10610009A9D22 /* import.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEAFDA620F10610009A9D22 /* import.swift */; };
AEBC61E3160A9AC38C3A210D /* Pods_Binary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5687B1A81F152DBEF5CD4432 /* Pods_Binary.framework */; };
/* End PBXBuildFile section */
+/* Begin PBXContainerItemProxy section */
+ 3EEAFD9120F1056E009A9D22 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 3E83E31A207BC00E0057855A /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 3EEAFD8E20F1056E009A9D22;
+ remoteInfo = "BinaryWatch Extension";
+ };
+ 3EEAFD9B20F1056E009A9D22 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 3E83E31A207BC00E0057855A /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 3EEAFD8220F1056D009A9D22;
+ remoteInfo = BinaryWatch;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 3EEAFDA320F1056E009A9D22 /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 3EEAFD9020F1056E009A9D22 /* BinaryWatch Extension.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3EEAFDA520F1056E009A9D22 /* Embed Watch Content */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
+ dstSubfolderSpec = 16;
+ files = (
+ 3EEAFD9D20F1056E009A9D22 /* BinaryWatch.app in Embed Watch Content */,
+ );
+ name = "Embed Watch Content";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
/* Begin PBXFileReference section */
1856F5E2BE44EDB1E470521A /* Pods-Binary.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Binary.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Binary/Pods-Binary.debug.xcconfig"; sourceTree = ""; };
3E1E217F20A0B66900EFA102 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = ""; };
@@ -20,6 +70,16 @@
3E83E325207BC00E0057855A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
3E83E327207BC00E0057855A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
3E83E331207BC0120057855A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BinaryWatch.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3EEAFD8620F1056D009A9D22 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; };
+ 3EEAFD8820F1056D009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 3EEAFD8A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BinaryWatch Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; };
+ 3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; };
+ 3EEAFD9820F1056E009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 3EEAFD9A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 3EEAFDA620F10610009A9D22 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = ""; };
5687B1A81F152DBEF5CD4432 /* Pods_Binary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Binary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7EB848DBE64BD495BCC04ECC /* Pods-Binary.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Binary.release.xcconfig"; path = "Pods/Target Support Files/Pods-Binary/Pods-Binary.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
@@ -33,6 +93,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 3EEAFD8C20F1056E009A9D22 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -40,6 +107,8 @@
isa = PBXGroup;
children = (
3E83E324207BC00E0057855A /* Binary */,
+ 3EEAFD8420F1056D009A9D22 /* BinaryWatch */,
+ 3EEAFD9320F1056E009A9D22 /* BinaryWatch Extension */,
3E83E323207BC00E0057855A /* Products */,
E8117D681BF19C1B3D847824 /* Pods */,
8E13F0A6AED19C681C2CD7D5 /* Frameworks */,
@@ -50,6 +119,8 @@
isa = PBXGroup;
children = (
3E83E322207BC00E0057855A /* Binary.app */,
+ 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */,
+ 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */,
);
name = Products;
sourceTree = "";
@@ -65,6 +136,28 @@
path = Binary;
sourceTree = "";
};
+ 3EEAFD8420F1056D009A9D22 /* BinaryWatch */ = {
+ isa = PBXGroup;
+ children = (
+ 3EEAFD8520F1056D009A9D22 /* Interface.storyboard */,
+ 3EEAFD8820F1056D009A9D22 /* Assets.xcassets */,
+ 3EEAFD8A20F1056E009A9D22 /* Info.plist */,
+ );
+ path = BinaryWatch;
+ sourceTree = "";
+ };
+ 3EEAFD9320F1056E009A9D22 /* BinaryWatch Extension */ = {
+ isa = PBXGroup;
+ children = (
+ 3EEAFD9420F1056E009A9D22 /* InterfaceController.swift */,
+ 3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */,
+ 3EEAFDA620F10610009A9D22 /* import.swift */,
+ 3EEAFD9820F1056E009A9D22 /* Assets.xcassets */,
+ 3EEAFD9A20F1056E009A9D22 /* Info.plist */,
+ );
+ path = "BinaryWatch Extension";
+ sourceTree = "";
+ };
8E13F0A6AED19C681C2CD7D5 /* Frameworks */ = {
isa = PBXGroup;
children = (
@@ -94,29 +187,71 @@
3E83E31F207BC00E0057855A /* Frameworks */,
3E83E320207BC00E0057855A /* Resources */,
9937F6A880D56826534273F0 /* [CP] Embed Pods Frameworks */,
+ 3EEAFDA520F1056E009A9D22 /* Embed Watch Content */,
);
buildRules = (
);
dependencies = (
+ 3EEAFD9C20F1056E009A9D22 /* PBXTargetDependency */,
);
name = Binary;
productName = Binary;
productReference = 3E83E322207BC00E0057855A /* Binary.app */;
productType = "com.apple.product-type.application";
};
+ 3EEAFD8220F1056D009A9D22 /* BinaryWatch */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3EEAFDA420F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch" */;
+ buildPhases = (
+ 3EEAFD8120F1056D009A9D22 /* Resources */,
+ 3EEAFDA320F1056E009A9D22 /* Embed App Extensions */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 3EEAFD9220F1056E009A9D22 /* PBXTargetDependency */,
+ );
+ name = BinaryWatch;
+ productName = BinaryWatch;
+ productReference = 3EEAFD8320F1056D009A9D22 /* BinaryWatch.app */;
+ productType = "com.apple.product-type.application.watchapp2";
+ };
+ 3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3EEAFDA220F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch Extension" */;
+ buildPhases = (
+ 3EEAFD8B20F1056E009A9D22 /* Sources */,
+ 3EEAFD8C20F1056E009A9D22 /* Frameworks */,
+ 3EEAFD8D20F1056E009A9D22 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "BinaryWatch Extension";
+ productName = "BinaryWatch Extension";
+ productReference = 3EEAFD8F20F1056E009A9D22 /* BinaryWatch Extension.appex */;
+ productType = "com.apple.product-type.watchkit2-extension";
+ };
/* End PBXNativeTarget section */
/* Begin PBXProject section */
3E83E31A207BC00E0057855A /* Project object */ = {
isa = PBXProject;
attributes = {
- LastSwiftUpdateCheck = 0930;
+ LastSwiftUpdateCheck = 1000;
LastUpgradeCheck = 0930;
ORGANIZATIONNAME = me.leavez;
TargetAttributes = {
3E83E321207BC00E0057855A = {
CreatedOnToolsVersion = 9.3;
};
+ 3EEAFD8220F1056D009A9D22 = {
+ CreatedOnToolsVersion = 10.0;
+ };
+ 3EEAFD8E20F1056E009A9D22 = {
+ CreatedOnToolsVersion = 10.0;
+ };
};
};
buildConfigurationList = 3E83E31D207BC00E0057855A /* Build configuration list for PBXProject "Binary" */;
@@ -133,6 +268,8 @@
projectRoot = "";
targets = (
3E83E321207BC00E0057855A /* Binary */,
+ 3EEAFD8220F1056D009A9D22 /* BinaryWatch */,
+ 3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */,
);
};
/* End PBXProject section */
@@ -145,6 +282,23 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 3EEAFD8120F1056D009A9D22 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3EEAFD8920F1056D009A9D22 /* Assets.xcassets in Resources */,
+ 3EEAFD8720F1056D009A9D22 /* Interface.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3EEAFD8D20F1056E009A9D22 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3EEAFD9920F1056E009A9D22 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
@@ -199,8 +353,42 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 3EEAFD8B20F1056E009A9D22 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3EEAFD9720F1056E009A9D22 /* ExtensionDelegate.swift in Sources */,
+ 3EEAFDA720F10610009A9D22 /* import.swift in Sources */,
+ 3EEAFD9520F1056E009A9D22 /* InterfaceController.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXSourcesBuildPhase section */
+/* Begin PBXTargetDependency section */
+ 3EEAFD9220F1056E009A9D22 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 3EEAFD8E20F1056E009A9D22 /* BinaryWatch Extension */;
+ targetProxy = 3EEAFD9120F1056E009A9D22 /* PBXContainerItemProxy */;
+ };
+ 3EEAFD9C20F1056E009A9D22 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 3EEAFD8220F1056D009A9D22 /* BinaryWatch */;
+ targetProxy = 3EEAFD9B20F1056E009A9D22 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 3EEAFD8520F1056D009A9D22 /* Interface.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 3EEAFD8620F1056D009A9D22 /* Base */,
+ );
+ name = Interface.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
/* Begin XCBuildConfiguration section */
3E83E332207BC0120057855A /* Debug */ = {
isa = XCBuildConfiguration;
@@ -322,7 +510,10 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Binary/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
@@ -336,7 +527,10 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Binary/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
@@ -344,6 +538,86 @@
};
name = Release;
};
+ 3EEAFD9E20F1056E009A9D22 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ IBSC_MODULE = BinaryWatch_Extension;
+ INFOPLIST_FILE = BinaryWatch/Info.plist;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 5.0;
+ };
+ name = Debug;
+ };
+ 3EEAFD9F20F1056E009A9D22 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ IBSC_MODULE = BinaryWatch_Extension;
+ INFOPLIST_FILE = BinaryWatch/Info.plist;
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 5.0;
+ };
+ name = Release;
+ };
+ 3EEAFDA020F1056E009A9D22 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = "BinaryWatch Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 5.0;
+ };
+ name = Debug;
+ };
+ 3EEAFDA120F1056E009A9D22 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = "BinaryWatch Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.leavez.Binary.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 5.0;
+ };
+ name = Release;
+ };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -365,6 +639,24 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 3EEAFDA220F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch Extension" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3EEAFDA020F1056E009A9D22 /* Debug */,
+ 3EEAFDA120F1056E009A9D22 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 3EEAFDA420F1056E009A9D22 /* Build configuration list for PBXNativeTarget "BinaryWatch" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3EEAFD9E20F1056E009A9D22 /* Debug */,
+ 3EEAFD9F20F1056E009A9D22 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
/* End XCConfigurationList section */
};
rootObject = 3E83E31A207BC00E0057855A /* Project object */;
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
new file mode 100644
index 0000000..f84499b
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : "<=145"
+ },
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : ">145"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Contents.json
new file mode 100644
index 0000000..c8ebf06
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Contents.json
@@ -0,0 +1,28 @@
+{
+ "assets" : [
+ {
+ "idiom" : "watch",
+ "filename" : "Circular.imageset",
+ "role" : "circular"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Extra Large.imageset",
+ "role" : "extra-large"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Modular.imageset",
+ "role" : "modular"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Utilitarian.imageset",
+ "role" : "utilitarian"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
new file mode 100644
index 0000000..f84499b
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : "<=145"
+ },
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : ">145"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
new file mode 100644
index 0000000..f84499b
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : "<=145"
+ },
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : ">145"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
new file mode 100644
index 0000000..f84499b
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : "<=145"
+ },
+ {
+ "idiom" : "watch",
+ "scale" : "2x",
+ "screen-width" : ">145"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/Assets.xcassets/Contents.json b/test/BinaryWatch Extension/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/test/BinaryWatch Extension/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch Extension/ExtensionDelegate.swift b/test/BinaryWatch Extension/ExtensionDelegate.swift
new file mode 100644
index 0000000..3b03918
--- /dev/null
+++ b/test/BinaryWatch Extension/ExtensionDelegate.swift
@@ -0,0 +1,21 @@
+//
+// ExtensionDelegate.swift
+// BinaryWatch Extension
+//
+// Created by Gao on 2018/7/7.
+// Copyright © 2018 me.leavez. All rights reserved.
+//
+
+import WatchKit
+
+class ExtensionDelegate: NSObject, WKExtensionDelegate {
+
+ func applicationDidFinishLaunching() {
+ // Perform any final initialization of your application.
+ }
+
+ func applicationDidBecomeActive() {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ }
+
+}
diff --git a/test/BinaryWatch Extension/Info.plist b/test/BinaryWatch Extension/Info.plist
new file mode 100644
index 0000000..7919078
--- /dev/null
+++ b/test/BinaryWatch Extension/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ BinaryWatch Extension
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ XPC!
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionAttributes
+
+ WKAppBundleIdentifier
+ me.leavez.Binary.watchkitapp
+
+ NSExtensionPointIdentifier
+ com.apple.watchkit
+
+ WKExtensionDelegateClassName
+ $(PRODUCT_MODULE_NAME).ExtensionDelegate
+
+
diff --git a/test/BinaryWatch Extension/InterfaceController.swift b/test/BinaryWatch Extension/InterfaceController.swift
new file mode 100644
index 0000000..8216054
--- /dev/null
+++ b/test/BinaryWatch Extension/InterfaceController.swift
@@ -0,0 +1,31 @@
+//
+// InterfaceController.swift
+// BinaryWatch Extension
+//
+// Created by Gao on 2018/7/7.
+// Copyright © 2018 me.leavez. All rights reserved.
+//
+
+import WatchKit
+import Foundation
+
+
+class InterfaceController: WKInterfaceController {
+
+ override func awake(withContext context: Any?) {
+ super.awake(withContext: context)
+
+ // Configure interface objects here.
+ }
+
+ override func willActivate() {
+ // This method is called when watch view controller is about to be visible to user
+ super.willActivate()
+ }
+
+ override func didDeactivate() {
+ // This method is called when watch view controller is no longer visible
+ super.didDeactivate()
+ }
+
+}
diff --git a/test/BinaryWatch Extension/import.swift b/test/BinaryWatch Extension/import.swift
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/test/BinaryWatch Extension/import.swift
@@ -0,0 +1 @@
+
diff --git a/test/BinaryWatch/Assets.xcassets/AppIcon.appiconset/Contents.json b/test/BinaryWatch/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..47bda83
--- /dev/null
+++ b/test/BinaryWatch/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,67 @@
+{
+ "images" : [
+ {
+ "size" : "24x24",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "notificationCenter",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "27.5x27.5",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "notificationCenter",
+ "subtype" : "42mm"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "appLauncher",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "44x44",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "longLook",
+ "subtype" : "42mm"
+ },
+ {
+ "size" : "86x86",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "quickLook",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "98x98",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "quickLook",
+ "subtype" : "42mm"
+ },
+ {
+ "idiom" : "watch-marketing",
+ "size" : "1024x1024",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch/Assets.xcassets/Contents.json b/test/BinaryWatch/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/test/BinaryWatch/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/test/BinaryWatch/Base.lproj/Interface.storyboard b/test/BinaryWatch/Base.lproj/Interface.storyboard
new file mode 100644
index 0000000..cf05d24
--- /dev/null
+++ b/test/BinaryWatch/Base.lproj/Interface.storyboard
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/BinaryWatch/Info.plist b/test/BinaryWatch/Info.plist
new file mode 100644
index 0000000..565bd7e
--- /dev/null
+++ b/test/BinaryWatch/Info.plist
@@ -0,0 +1,33 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Binary
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+
+ WKCompanionAppBundleIdentifier
+ me.leavez.Binary
+ WKWatchKitApp
+
+
+
diff --git a/test/Gemfile b/test/Gemfile
new file mode 100644
index 0000000..9a3ea13
--- /dev/null
+++ b/test/Gemfile
@@ -0,0 +1,7 @@
+
+# frozen_string_literal: true
+source "https://rubygems.org"
+
+gem 'cocoapods', '1.6.1'
+gem 'cocoapods-binary', :path => "../"
+
diff --git a/test/change_podfile.py b/test/change_podfile.py
index 6c70715..5f31510 100644
--- a/test/change_podfile.py
+++ b/test/change_podfile.py
@@ -4,6 +4,7 @@
def wrapper(content):
return """
platform :ios, '9.0'
+inhibit_all_warnings!
use_frameworks!
plugin "cocoapods-binary"
@@ -25,28 +26,64 @@ def save_to_podfile(text):
file.write(text[1])
file.close()
+ path = os.path.dirname(os.path.abspath(__file__))
+ path += "/BinaryWatch Extension/import.swift"
+ file = open(path, "w+")
+ file.write( "" if len(text) <= 2 else text[2])
+ file.close()
+
def initial():
return (wrapper(
"""
+keep_source_code_for_prebuilt_frameworks!
+
pod "Masonry"
"""),
"""
import Masonry
+class A {
+ let d = UIView().mas_top
+}
""")
def addSwiftPod():
return (wrapper(
"""
-pod "Masonry", :binary => true
+keep_source_code_for_prebuilt_frameworks!
+
+pod "RxCocoa", :binary => true
pod "Literal", :binary => true
"""),
"""
-import Masonry
+import RxCocoa
import Literal
+class A {
+ let a: CGRect = [1,2,3,4]
+ func dd() { NSObject().rx.observe(CGRect.self, "frame") }
+}
""")
+def revertToSourceCode():
+ return (wrapper(
+"""
+keep_source_code_for_prebuilt_frameworks!
+
+pod "RxCocoa", :binary => true
+pod "Literal"
+"""),
+"""
+import RxCocoa
+import RxSwift
+import Literal
+class A {
+ let a: CGRect = [1,2,3,4]
+ let b = Observable.just(1)
+ func dd() { NSObject().rx.observe(CGRect.self, "frame") }
+}
+""")
+
def addDifferentNamePod():
return (wrapper(
"""
@@ -60,6 +97,11 @@ def addDifferentNamePod():
import Masonry
import Literal
import Lottie
+class A {
+ let a: CGRect = [1,2,3,4]
+ let a2 = AnimationView.self
+ let d = UIView().mas_top
+}
""")
@@ -76,6 +118,12 @@ def addSubPod():
import Literal
import Lottie
import AFNetworking
+class A {
+ let a: CGRect = [1,2,3,4]
+ let a2 = AnimationView.self
+ let b = AFNetworkReachabilityManager()
+ let d = UIView().mas_top
+}
""")
def addVendoredLibPod():
@@ -90,6 +138,11 @@ def addVendoredLibPod():
import Literal
import AFNetworking
import Instabug
+class A {
+ let a: CGRect = [1,2,3,4]
+ let b = AFNetworkReachabilityManager()
+ let c = Instabug.self
+}
""")
def deleteAPod():
@@ -101,6 +154,10 @@ def deleteAPod():
"""
import Literal
import AFNetworking
+class A {
+ let a: CGRect = [1,2,3,4]
+ let b = AFNetworkReachabilityManager()
+}
""")
def universalFlag():
@@ -114,25 +171,70 @@ def universalFlag():
"""
import Literal
import AFNetworking
+class A {
+ let a: CGRect = [1,2,3,4]
+ let b = AFNetworkReachabilityManager()
+}
""")
+def multiplePlatforms():
+ return (wrapper(
+"""
+pod "Literal", :binary => true
+pod "AFNetworking/Serialization", :binary => true
+end
+target 'BinaryWatch Extension' do
+ platform :watchos
+ pod "AFNetworking/Serialization", :binary => true
+""") ,
+"""
+import Literal
+import AFNetworking
+class A {
+ let a: CGRect = [1,2,3,4]
+ func dd() { _ = AFURLRequestSerializationErrorDomain }
+}
+""",
+"""
+import AFNetworking
+class A {
+ func dd() { _ = AFURLRequestSerializationErrorDomain }
+}
+"""
+)
+
+def multiplePlatformsWithALLFlag():
+ return (wrapper(
+"""
+all_binary!
+
+pod "Literal"
+pod "AFNetworking/Serialization"
+end
+
+target 'BinaryWatch Extension' do
+ platform :watchos
+ pod "AFNetworking/Serialization"
+""") ,
+"""
+import Literal
+import AFNetworking
+class A {
+ let a: CGRect = [1,2,3,4]
+ func dd() { _ = AFURLRequestSerializationErrorDomain }
+}
+""",
+"""
+import AFNetworking
+class A {
+ func dd() { _ = AFURLRequestSerializationErrorDomain }
+}
+"""
+)
if __name__ == "__main__":
arg = sys.argv[1]
- print("change Podfile to: " + arg)
- if arg == "initial":
- save_to_podfile(initial())
- elif arg == "addSwiftPod":
- save_to_podfile(addSwiftPod())
- elif arg == "addDifferentNamePod":
- save_to_podfile(addDifferentNamePod())
- elif arg == "addSubPod":
- save_to_podfile(addSubPod())
- elif arg == "deleteAPod":
- save_to_podfile(deleteAPod())
- elif arg == "addVendoredLibPod":
- save_to_podfile(addVendoredLibPod())
- elif arg == "universalFlag":
- save_to_podfile(universalFlag())
+ print("===================\nchange Podfile to: " + arg + "\n")
+ save_to_podfile(globals()[arg]())
\ No newline at end of file
diff --git a/test/logo.png b/test/logo.png
new file mode 100644
index 0000000..531535a
Binary files /dev/null and b/test/logo.png differ
diff --git a/test/test.sh b/test/test.sh
index c74a5e0..4aa46dc 100644
--- a/test/test.sh
+++ b/test/test.sh
@@ -2,42 +2,16 @@
set -e
build() {
- xcodebuild -workspace Binary.xcworkspace -scheme Binary ONLY_ACTIVE_ARCH=YES CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -quiet || exit 1
-}
+ xcodebuild -workspace Binary.xcworkspace -scheme Binary ONLY_ACTIVE_ARCH=YES CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -quiet || exit 1
+}
-python change_podfile.py "initial"
-pod install
-build
+rm -rf Pods
-#
-python change_podfile.py "addSwiftPod"
-pod install
-build
+cases=("initial" "addSwiftPod" "revertToSourceCode" "addDifferentNamePod" "addSubPod" "deleteAPod" "addVendoredLibPod" "universalFlag" "multiplePlatforms" "multiplePlatformsWithALLFlag")
+for action in ${cases[@]}; do
+ python change_podfile.py ${action}
+ bundle exec pod install
+ build
+done
-#
-python change_podfile.py "addDifferentNamePod"
-pod install
-build
-
-#
-python change_podfile.py "addSubPod"
-pod install
-build
-
-#
-python change_podfile.py "deleteAPod"
-pod install
-build
-
-#
-python change_podfile.py "addVendoredLibPod"
-pod install
-build
-
-#
-python change_podfile.py "universalFlag"
-pod install
-build
-
-#
exit 0