Compare commits

...

35 Commits

Author SHA1 Message Date
leavez
537e8557ac fix resource_bundle bugs when static framework
fix https://github.com/leavez/cocoapods-binary/issues/29
2019-03-05 01:04:01 +08:00
hardworker
ef8c551b0f Added lockfile parameter passing to installer initializer 2019-02-27 01:14:09 +08:00
X140Yu
2b22adce9b
Update log 2019-01-18 16:08:37 +08:00
Leave
744765583e
Update README.md 2019-01-16 20:04:28 +08:00
leavez
d3f529d1d9 fix the checking 2018-07-11 01:41:23 +08:00
leavez
988a09f7ac fix validate_every_pod_only_have_one_form 2018-07-11 00:32:58 +08:00
leavez
62af283ecd fix pod_name_for_target_folder 2018-07-11 00:32:58 +08:00
leavez
971381a4ab don't print warning for prebuild step when finished 2018-07-08 02:16:41 +08:00
Leave
cfc63e1f38
Merge pull request #26 from leavez/watch
support multiple platform simultaneously (e.g. watchOS and iOS)
2018-07-08 02:14:25 +08:00
leavez
589bc22574 add content in test 2018-07-08 01:44:58 +08:00
leavez
3333385db6 fix test 2018-07-08 01:28:38 +08:00
leavez
d234833546 fix validate_every_pod_only_have_one_form 2018-07-08 00:58:07 +08:00
leavez
cdc913a5a3 fix test 2018-07-07 22:53:37 +08:00
leavez
6586f404f1 add test for multiplePlatforms 2018-07-07 22:40:55 +08:00
leavez
250ee365e4 add target for test 2018-07-07 22:31:37 +08:00
leavez
4f0d0c87cb add check for different forms 2018-07-07 22:23:29 +08:00
leavez
702f5020bc fix save_pod_name_for_target 2018-07-07 21:06:59 +08:00
leavez
01430ed68c fix pod_name_for_target_folder 2018-07-07 20:46:20 +08:00
leavez
99f90d8e5a fix the pod_name_target finding 2018-07-07 20:30:11 +08:00
leavez
ad15231e7c add compatibility with older version 2018-07-07 19:39:55 +08:00
leavez
d78acb3b57 add comments 2018-07-07 19:29:10 +08:00
leavez
c5efe4350c refactor patch integration to support multiple platfroms 2018-07-07 19:21:40 +08:00
leavez
411965ed2e refactor pod_name and target_name tranfrom 2018-07-07 19:18:27 +08:00
leavez
c1e876e62a fix name usages 2.2 2018-07-07 16:14:18 +08:00
leavez
58eeb3f4c5 fix name usage 2.1 2018-07-07 15:57:41 +08:00
leavez
c80d9ba699 fix name usage 2 2018-07-07 15:54:35 +08:00
leavez
4c2a3ad06b add comments for names 2018-07-07 03:53:32 +08:00
leavez
31fdc383ab organize name usages 2018-07-07 03:44:01 +08:00
leavez
a8985c5264 installing prebuild pod support multiple platforms 2018-07-07 03:06:02 +08:00
leavez
710839eafd rename framework_folder_path_for_pod_name to framework_folder_path_for_target_name 2018-07-07 02:04:09 +08:00
leavez
1e357dc100 simplify label with target.name 2018-07-07 01:41:46 +08:00
leavez
cfe476404a rome supports build watchos 2018-07-07 01:14:25 +08:00
leavez
69bc8c3788 fix prebuild framework paths when have multiple platforms 2018-07-07 01:13:37 +08:00
leavez
2238d25dc2 remove filter for watchos 2018-07-04 23:59:53 +08:00
leavez
c44e490a7d add logo 2018-07-04 23:34:44 +08:00
27 changed files with 1025 additions and 136 deletions

View File

@ -1,9 +1,13 @@
# cocoapods-binary
<p align="center"><img src="/test/logo.png" width="622"></p>
[![Build Status](https://travis-ci.org/leavez/cocoapods-binary.svg?branch=master)](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.

View File

@ -2,6 +2,8 @@ require_relative 'helper/podfile_options'
require_relative 'helper/feature_switches'
require_relative 'helper/prebuild_sandbox'
require_relative 'helper/passer'
require_relative 'helper/names'
# NOTE:
@ -24,13 +26,9 @@ module Pod
# 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)
path.children.each do |child|
result = action.call(child, &action)
@ -50,31 +48,51 @@ module Pod
target = target_folder + source.relative_path_from(basefolder)
make_link(source, target)
end
target_names.each do |name|
# 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
# 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
end
target_folder.rmtree if target_folder.exist?
target_folder.mkpath
# 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)
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
end
end
end
end
# 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 # of for each
end # of method
end
end
@ -95,7 +113,7 @@ module Pod
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,45 +145,72 @@ module Pod
# call original
old_method2.bind(self).()
# ...
# ...
# ...
# after finishing the very complex orginal function
# check the prebuilt targets
targets = self.prebuild_pod_targets
targets_have_different_platforms = targets.select {|t| t.pod_name != t.name }
# check
self.validate_every_pod_only_have_one_form
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
# prepare
cache = []
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
specs = self.analysis_result.specifications
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"] = {}

View File

@ -48,7 +48,7 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
# 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
@ -80,7 +80,8 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
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?
binary_installer.install_when_cache_hit!
@ -97,6 +98,7 @@ Pod::HooksManager.register('cocoapods-binary', :pre_install) do |installer_conte
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 ---

View File

@ -43,11 +43,9 @@ module Pod
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 +56,7 @@ module Pod
# 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,24 +80,21 @@ module Pod
deleted = changes.deleted
existed_framework_folder.mkdir unless existed_framework_folder.exist?
exsited_framework_names = sandbox.exsited_framework_names
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|
Pod.fast_get_targets_for_pod_name(pod_name, self.pod_targets, cache)
end.flatten
# add the dendencies
dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
@ -117,8 +112,8 @@ module Pod
Pod::Prebuild.remove_build_dir(sandbox_path)
targets.each do |target|
next unless target.should_build?
output_path = sandbox.framework_folder_path_for_target_name(target.name)
output_path = sandbox.framework_folder_path_for_pod_name(target.name)
output_path.mkpath unless output_path.exist?
Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled)
@ -126,14 +121,16 @@ module Pod
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|
path_objects = target.resource_paths.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)
@ -141,12 +138,12 @@ module Pod
# 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
@ -164,15 +161,20 @@ module Pod
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
# remove useless pods
all_needed_names = self.pod_targets.map(&:name).uniq
useless_names = sandbox.exsited_framework_names.reject do |name|
useless_target_names = sandbox.exsited_framework_target_names.reject do |name|
all_needed_names.include? name
end
useless_names.each do |name|
path = sandbox.framework_folder_path_for_pod_name(name)
useless_target_names.each do |name|
path = sandbox.framework_folder_path_for_target_name(name)
path.rmtree if path.exist?
end

View File

@ -38,11 +38,6 @@ module Pod
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

View File

@ -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

View File

@ -11,40 +11,41 @@ module Pod
## --- 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 +69,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 +86,7 @@ module Pod
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 +94,7 @@ module Pod
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 +102,27 @@ module Pod
@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

View File

@ -1,3 +1,5 @@
require_relative "names"
module Pod
class PrebuildSandbox < Sandbox
@ -19,31 +21,53 @@ module Pod
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
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 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_name|
if framework_name.directory?
if not framework_name.children.empty?
File.basename(framework_name)
else
nil
end
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?)
end.reject(&:nil?).uniq
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
end
end
end
end

View File

@ -15,11 +15,12 @@ def build_for_iosish_platform(sandbox,
target,
device,
simulator,
bitcode_enabled)
bitcode_enabled,
simulator_default_arch)
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 = []
@ -27,13 +28,13 @@ def build_for_iosish_platform(sandbox,
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'])
xcodebuild(sandbox, target_label, simulator, deployment_target, other_options + ["ARCHS=#{simulator_default_arch}",'ONLY_ACTIVE_ARCH=NO'])
# paths
root_name = target.pod_name
target_name = target.name # equals target.label, like "AFNeworking-iOS" when AFNetworking is used in multiple platforms.
module_name = target.product_module_name
device_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{root_name}/#{module_name}.framework"
simulator_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{root_name}/#{module_name}.framework"
device_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{device}/#{target_name}/#{module_name}.framework"
simulator_framwork_path = "#{build_dir}/#{CONFIGURATION}-#{simulator}/#{target_name}/#{module_name}.framework"
device_binary = device_framwork_path + "/#{module_name}"
simulator_binary = simulator_framwork_path + "/#{module_name}"
@ -41,7 +42,7 @@ def build_for_iosish_platform(sandbox,
# the device_lib path is the final output file path
# combine the bianries
tmp_lipoed_binary_path = "#{build_dir}/#{root_name}"
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
@ -93,10 +94,10 @@ module Pod
# -- 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 :ios then build_for_iosish_platform(sandbox, build_dir, output_path, target, 'iphoneos', 'iphonesimulator', bitcode_enabled, "x86_64")
when :osx then xcodebuild(sandbox, target.label)
# 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, "i386")
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?

View File

@ -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 = "<group>"; };
3E1E217F20A0B66900EFA102 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = "<group>"; };
@ -20,6 +70,16 @@
3E83E325207BC00E0057855A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
3E83E327207BC00E0057855A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
3E83E331207BC0120057855A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
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 = "<group>"; };
3EEAFD8820F1056D009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
3EEAFD8A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
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 = "<group>"; };
3EEAFD9620F1056E009A9D22 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
3EEAFD9820F1056E009A9D22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
3EEAFD9A20F1056E009A9D22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3EEAFDA620F10610009A9D22 /* import.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = import.swift; sourceTree = "<group>"; };
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 = "<group>"; };
/* 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 = "<group>";
@ -65,6 +136,28 @@
path = Binary;
sourceTree = "<group>";
};
3EEAFD8420F1056D009A9D22 /* BinaryWatch */ = {
isa = PBXGroup;
children = (
3EEAFD8520F1056D009A9D22 /* Interface.storyboard */,
3EEAFD8820F1056D009A9D22 /* Assets.xcassets */,
3EEAFD8A20F1056E009A9D22 /* Info.plist */,
);
path = BinaryWatch;
sourceTree = "<group>";
};
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 = "<group>";
};
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 = "<group>";
};
/* 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 */;

View File

@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -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"
}
}

View File

@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -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.
}
}

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>BinaryWatch Extension</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>WKAppBundleIdentifier</key>
<string>me.leavez.Binary.watchkitapp</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.watchkit</string>
</dict>
<key>WKExtensionDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).ExtensionDelegate</string>
</dict>
</plist>

View File

@ -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()
}
}

View File

@ -0,0 +1 @@

View File

@ -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"
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="11134" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="11055"/>
</dependencies>
<scenes>
<!--Interface Controller-->
<scene sceneID="aou-V4-d1y">
<objects>
<controller id="AgC-eL-Hgc" customClass="InterfaceController" customModuleProvider="target"/>
</objects>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Binary</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>WKCompanionAppBundleIdentifier</key>
<string>me.leavez.Binary</string>
<key>WKWatchKitApp</key>
<true/>
</dict>
</plist>

View File

@ -25,6 +25,12 @@ 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():
@ -36,6 +42,9 @@ pod "Masonry"
"""),
"""
import Masonry
class A {
let d = UIView().mas_top
}
""")
def addSwiftPod():
@ -49,6 +58,10 @@ pod "Literal", :binary => true
"""
import RxCocoa
import Literal
class A {
let a: CGRect = [1,2,3,4]
func dd() { NSObject().rx.observe(CGRect.self, "frame") }
}
""")
def revertToSourceCode():
@ -61,7 +74,13 @@ 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():
@ -77,6 +96,11 @@ pod "lottie-ios", :binary => true
import Masonry
import Literal
import Lottie
class A {
let a: CGRect = [1,2,3,4]
let a2 = LOTAnimationView.self
let d = UIView().mas_top
}
""")
@ -93,6 +117,12 @@ import Masonry
import Literal
import Lottie
import AFNetworking
class A {
let a: CGRect = [1,2,3,4]
let a2 = LOTAnimationView.self
let b = AFNetworkReachabilityManager()
let d = UIView().mas_top
}
""")
def addVendoredLibPod():
@ -107,6 +137,11 @@ pod "GrowingIO", :binary => true
import Literal
import AFNetworking
import Instabug
class A {
let a: CGRect = [1,2,3,4]
let b = AFNetworkReachabilityManager()
let c = Instabug.self
}
""")
def deleteAPod():
@ -118,6 +153,10 @@ pod "AFNetworking/Reachability", :binary => true
"""
import Literal
import AFNetworking
class A {
let a: CGRect = [1,2,3,4]
let b = AFNetworkReachabilityManager()
}
""")
def universalFlag():
@ -131,9 +170,67 @@ pod "AFNetworking/Reachability"
"""
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__":

BIN
test/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -46,5 +46,15 @@ python change_podfile.py "universalFlag"
pod install
build
#
python change_podfile.py "multiplePlatforms"
pod install
build
#
python change_podfile.py "multiplePlatformsWithALLFlag"
pod install
build
#
exit 0