Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
C
cocoapods
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gengmeiios
cocoapods
Commits
0ffb7a6b
Commit
0ffb7a6b
authored
Nov 14, 2015
by
Samuel Giddins
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Ensure all user projects are properly integrated
parent
85ef27f5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
79 additions
and
109 deletions
+79
-109
Gemfile.lock
Gemfile.lock
+3
-3
user_project_integrator.rb
lib/cocoapods/installer/user_project_integrator.rb
+39
-2
target_integrator.rb
...ds/installer/user_project_integrator/target_integrator.rb
+25
-72
xcconfig_integrator.rb
...oject_integrator/target_integrator/xcconfig_integrator.rb
+8
-19
target_integrator_spec.rb
...staller/user_project_integrator/target_integrator_spec.rb
+4
-13
No files found.
Gemfile.lock
View file @
0ffb7a6b
GIT
GIT
remote: https://github.com/CocoaPods/CLAide.git
remote: https://github.com/CocoaPods/CLAide.git
revision:
b44534d04023fbe82182a8be33d5c728f74c1b9c
revision:
4ded02e52c34d5bbe5f6f031d917394286445aa6
branch: master
branch: master
specs:
specs:
claide (0.9.1)
claide (0.9.1)
...
@@ -24,7 +24,7 @@ GIT
...
@@ -24,7 +24,7 @@ GIT
GIT
GIT
remote: https://github.com/CocoaPods/Xcodeproj.git
remote: https://github.com/CocoaPods/Xcodeproj.git
revision:
ad8f6b78e424c274b63ff42ff6ad72840cb307a6
revision:
eea8f8d58eef635f2cc9121ee1af6a5478a2841c
branch: master
branch: master
specs:
specs:
xcodeproj (0.28.2)
xcodeproj (0.28.2)
...
@@ -154,7 +154,7 @@ GEM
...
@@ -154,7 +154,7 @@ GEM
rb-kqueue (>= 0.2)
rb-kqueue (>= 0.2)
metaclass (0.0.4)
metaclass (0.0.4)
method_source (0.8.2)
method_source (0.8.2)
minitest (5.8.
2
)
minitest (5.8.
3
)
mocha (1.1.0)
mocha (1.1.0)
metaclass (~> 0.0.1)
metaclass (~> 0.0.1)
mocha-on-bacon (0.2.2)
mocha-on-bacon (0.2.2)
...
...
lib/cocoapods/installer/user_project_integrator.rb
View file @
0ffb7a6b
...
@@ -5,6 +5,8 @@ require 'active_support/core_ext/string/inflections'
...
@@ -5,6 +5,8 @@ require 'active_support/core_ext/string/inflections'
require
'active_support/core_ext/array/conversions'
require
'active_support/core_ext/array/conversions'
module
Pod
module
Pod
autoload
:Deintegrator
,
'cocoapods_deintegrate'
class
Installer
class
Installer
# The {UserProjectIntegrator} integrates the libraries generated by
# The {UserProjectIntegrator} integrates the libraries generated by
# TargetDefinitions of the {Podfile} with their correspondent user
# TargetDefinitions of the {Podfile} with their correspondent user
...
@@ -63,6 +65,7 @@ module Pod
...
@@ -63,6 +65,7 @@ module Pod
integrate_user_targets
integrate_user_targets
warn_about_empty_podfile
warn_about_empty_podfile
warn_about_xcconfig_overrides
warn_about_xcconfig_overrides
save_projects
end
end
#-----------------------------------------------------------------------#
#-----------------------------------------------------------------------#
...
@@ -112,8 +115,38 @@ module Pod
...
@@ -112,8 +115,38 @@ module Pod
# @return [void]
# @return [void]
#
#
def
integrate_user_targets
def
integrate_user_targets
targets_to_integrate
.
sort_by
(
&
:name
).
each
do
|
target
|
target_integrators
=
targets_to_integrate
.
sort_by
(
&
:name
).
map
do
|
target
|
TargetIntegrator
.
new
(
target
).
integrate!
TargetIntegrator
.
new
(
target
)
end
Config
.
instance
.
with_changes
(
:silent
=>
true
)
do
deintegrator
=
Deintegrator
.
new
all_project_targets
=
target_integrators
.
map
(
&
:user_project
).
flat_map
(
&
:native_targets
).
uniq
all_native_targets
=
target_integrators
.
flat_map
(
&
:native_targets
).
uniq
targets_to_deintegrate
=
all_project_targets
-
all_native_targets
targets_to_deintegrate
.
each
do
|
target
|
deintegrator
.
deintegrate_target
(
target
)
end
end
target_integrators
.
each
(
&
:integrate!
)
end
def
save_projects
user_projects
.
each
do
|
project
|
if
project
.
dirty?
project
.
save
else
# There is a bug in Xcode where the process of deleting and
# re-creating the xcconfig files used in the build
# configuration cause building the user project to fail until
# Xcode is relaunched.
#
# Touching/saving the project causes Xcode to reload these.
#
# https://github.com/CocoaPods/CocoaPods/issues/2665
FileUtils
.
touch
(
project
.
path
+
'project.pbxproj'
)
end
end
end
end
end
...
@@ -194,6 +227,10 @@ module Pod
...
@@ -194,6 +227,10 @@ module Pod
targets
.
map
(
&
:user_project_path
).
compact
.
uniq
targets
.
map
(
&
:user_project_path
).
compact
.
uniq
end
end
def
user_projects
targets
.
map
(
&
:user_project
).
compact
.
uniq
end
def
targets_to_integrate
def
targets_to_integrate
targets
.
reject
{
|
target
|
target
.
target_definition
.
empty?
}
targets
.
reject
{
|
target
|
target
.
target_definition
.
empty?
}
end
end
...
...
lib/cocoapods/installer/user_project_integrator/target_integrator.rb
View file @
0ffb7a6b
...
@@ -38,34 +38,15 @@ module Pod
...
@@ -38,34 +38,15 @@ module Pod
#
#
def
integrate!
def
integrate!
UI
.
section
(
integration_message
)
do
UI
.
section
(
integration_message
)
do
# TODO: refactor into Xcodeproj https://github.com/CocoaPods/Xcodeproj/issues/202
XCConfigIntegrator
.
integrate
(
target
,
native_targets
)
project_is_dirty
=
[
update_to_cocoapods_0_34
XCConfigIntegrator
.
integrate
(
target
,
native_targets
),
update_to_cocoapods_0_37_1
update_to_cocoapods_0_34
,
update_to_cocoapods_0_39
update_to_cocoapods_0_37_1
,
update_to_cocoapods_0_39
,
add_pods_library
unless
native_targets_to_integrate
.
empty?
add_embed_frameworks_script_phase
add_pods_library
add_copy_resources_script_phase
add_embed_frameworks_script_phase
add_check_manifest_lock_script_phase
add_copy_resources_script_phase
add_check_manifest_lock_script_phase
true
end
,
].
any?
if
project_is_dirty
user_project
.
save
else
# There is a bug in Xcode where the process of deleting and
# re-creating the xcconfig files used in the build
# configuration cause building the user project to fail until
# Xcode is relaunched.
#
# Touching/saving the project causes Xcode to reload these.
#
# https://github.com/CocoaPods/CocoaPods/issues/2665
FileUtils
.
touch
(
user_project
.
path
+
'project.pbxproj'
)
end
end
end
end
end
...
@@ -95,14 +76,11 @@ module Pod
...
@@ -95,14 +76,11 @@ module Pod
script_path
=
target
.
copy_resources_script_relative_path
script_path
=
target
.
copy_resources_script_relative_path
shell_script
=
%("#{script_path}"\n)
shell_script
=
%("#{script_path}"\n)
changes
=
false
phases
.
each
do
|
phase
|
phases
.
each
do
|
phase
|
unless
phase
.
shell_script
==
shell_script
unless
phase
.
shell_script
==
shell_script
phase
.
shell_script
=
shell_script
phase
.
shell_script
=
shell_script
changes
=
true
end
end
end
end
changes
end
end
# Removes the embed frameworks phase for target types.
# Removes the embed frameworks phase for target types.
...
@@ -122,21 +100,15 @@ module Pod
...
@@ -122,21 +100,15 @@ module Pod
# Adds the embed frameworks script when integrating as a static library.
# Adds the embed frameworks script when integrating as a static library.
#
#
# @return [Bool] whether any changes to the project were made.
#
# @todo This can be removed for CocoaPods 1.0
# @todo This can be removed for CocoaPods 1.0
#
#
def
update_to_cocoapods_0_39
def
update_to_cocoapods_0_39
targets_to_embed
=
native_targets
.
select
do
|
target
|
targets_to_embed
=
native_targets
.
select
do
|
target
|
EMBED_FRAMEWORK_TARGET_TYPES
.
include?
(
target
.
symbol_type
)
EMBED_FRAMEWORK_TARGET_TYPES
.
include?
(
target
.
symbol_type
)
end
end
requires_update
=
targets_to_embed
.
any?
do
|
target
|
!
target
.
shell_script_build_phases
.
find
{
|
bp
|
bp
.
name
==
EMBED_FRAMEWORK_PHASE_NAME
}
targets_to_embed
.
each
do
|
native_target
|
end
add_embed_frameworks_script_phase_to_target
(
native_target
)
if
requires_update
targets_to_embed
.
each
do
|
native_target
|
add_embed_frameworks_script_phase_to_target
(
native_target
)
end
end
end
frameworks
=
user_project
.
frameworks_group
frameworks
=
user_project
.
frameworks_group
...
@@ -151,12 +123,9 @@ module Pod
...
@@ -151,12 +123,9 @@ module Pod
build_file
.
settings
[
'ATTRIBUTES'
].
is_a?
(
Array
)
&&
build_file
.
settings
[
'ATTRIBUTES'
].
is_a?
(
Array
)
&&
build_file
.
settings
[
'ATTRIBUTES'
].
include?
(
'Weak'
)
build_file
.
settings
[
'ATTRIBUTES'
].
include?
(
'Weak'
)
build_file
.
settings
=
nil
build_file
.
settings
=
nil
requires_update
=
true
end
end
end
end
end
end
requires_update
end
end
# Adds spec product reference to the frameworks build phase of the
# Adds spec product reference to the frameworks build phase of the
...
@@ -168,7 +137,7 @@ module Pod
...
@@ -168,7 +137,7 @@ module Pod
#
#
def
add_pods_library
def
add_pods_library
frameworks
=
user_project
.
frameworks_group
frameworks
=
user_project
.
frameworks_group
native_targets
_to_integrate
.
each
do
|
native_target
|
native_targets
.
each
do
|
native_target
|
build_phase
=
native_target
.
frameworks_build_phase
build_phase
=
native_target
.
frameworks_build_phase
# Find and delete possible reference for the other product type
# Find and delete possible reference for the other product type
...
@@ -209,13 +178,10 @@ module Pod
...
@@ -209,13 +178,10 @@ module Pod
#
#
# @param [PBXNativeTarget] native_target
# @param [PBXNativeTarget] native_target
#
#
# @return [Bool] whether any changes to the project were made.
#
def
remove_embed_frameworks_script_phase
(
native_target
)
def
remove_embed_frameworks_script_phase
(
native_target
)
embed_build_phase
=
native_target
.
shell_script_build_phases
.
find
{
|
bp
|
bp
.
name
==
EMBED_FRAMEWORK_PHASE_NAME
}
embed_build_phase
=
native_target
.
shell_script_build_phases
.
find
{
|
bp
|
bp
.
name
==
EMBED_FRAMEWORK_PHASE_NAME
}
return
false
unless
embed_build_phase
.
present?
return
unless
embed_build_phase
.
present?
native_target
.
build_phases
.
delete
(
embed_build_phase
)
native_target
.
build_phases
.
delete
(
embed_build_phase
)
true
end
end
# Adds a shell script build phase responsible to copy the resources
# Adds a shell script build phase responsible to copy the resources
...
@@ -226,7 +192,7 @@ module Pod
...
@@ -226,7 +192,7 @@ module Pod
#
#
def
add_copy_resources_script_phase
def
add_copy_resources_script_phase
phase_name
=
'Copy Pods Resources'
phase_name
=
'Copy Pods Resources'
native_targets
_to_integrate
.
each
do
|
native_target
|
native_targets
.
each
do
|
native_target
|
phase
=
create_or_update_build_phase
(
native_target
,
phase_name
)
phase
=
create_or_update_build_phase
(
native_target
,
phase_name
)
script_path
=
target
.
copy_resources_script_relative_path
script_path
=
target
.
copy_resources_script_relative_path
phase
.
shell_script
=
%("#{script_path}"\n)
phase
.
shell_script
=
%("#{script_path}"\n)
...
@@ -244,9 +210,9 @@ module Pod
...
@@ -244,9 +210,9 @@ module Pod
#
#
def
add_check_manifest_lock_script_phase
def
add_check_manifest_lock_script_phase
phase_name
=
'Check Pods Manifest.lock'
phase_name
=
'Check Pods Manifest.lock'
native_targets
_to_integrate
.
each
do
|
native_target
|
native_targets
.
each
do
|
native_target
|
phase
=
create_or_update_build_phase
(
native_target
,
phase_name
)
phase
=
create_or_update_build_phase
(
native_target
,
phase_name
)
native_target
.
build_phases
.
unshift
(
phase
).
uniq!
native_target
.
build_phases
.
unshift
(
phase
).
uniq!
unless
native_target
.
build_phases
.
first
==
phase
phase
.
shell_script
=
<<-
SH
.
strip_heredoc
phase
.
shell_script
=
<<-
SH
.
strip_heredoc
diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [[ $? != 0 ]] ; then
if [[ $? != 0 ]] ; then
...
@@ -259,9 +225,9 @@ module Pod
...
@@ -259,9 +225,9 @@ module Pod
end
end
end
end
p
rivate
p
ublic
# @!group
Private h
elpers
# @!group
H
elpers
#---------------------------------------------------------------------#
#---------------------------------------------------------------------#
# @return [Array<PBXNativeTarget>] The list of all the targets that
# @return [Array<PBXNativeTarget>] The list of all the targets that
...
@@ -276,29 +242,11 @@ module Pod
...
@@ -276,29 +242,11 @@ module Pod
# directory / product bundle.
# directory / product bundle.
#
#
def
native_targets_to_embed_in
def
native_targets_to_embed_in
native_targets
_to_integrate
.
select
do
|
target
|
native_targets
.
select
do
|
target
|
EMBED_FRAMEWORK_TARGET_TYPES
.
include?
(
target
.
symbol_type
)
EMBED_FRAMEWORK_TARGET_TYPES
.
include?
(
target
.
symbol_type
)
end
end
end
end
# @return [Array<PBXNativeTarget>] The list of the targets
# that have not been integrated by past installations
# of
#
def
native_targets_to_integrate
unless
@native_targets_to_integrate
@native_targets_to_integrate
=
native_targets
.
reject
do
|
native_target
|
native_target
.
frameworks_build_phase
.
files
.
any?
do
|
build_file
|
file_ref
=
build_file
.
file_ref
file_ref
&&
file_ref
.
isa
==
'PBXFileReference'
&&
file_ref
.
display_name
==
target
.
product_name
end
end
end
@native_targets_to_integrate
end
# Read the project from the disk to ensure that it is up to date as
# Read the project from the disk to ensure that it is up to date as
# other TargetIntegrators might have modified it.
# other TargetIntegrators might have modified it.
#
#
...
@@ -308,6 +256,11 @@ module Pod
...
@@ -308,6 +256,11 @@ module Pod
target
.
user_project
target
.
user_project
end
end
private
# @!group Private Helpers
#---------------------------------------------------------------------#
# @return [Specification::Consumer] the consumer for the specifications.
# @return [Specification::Consumer] the consumer for the specifications.
#
#
def
spec_consumers
def
spec_consumers
...
...
lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb
View file @
0ffb7a6b
...
@@ -15,17 +15,13 @@ module Pod
...
@@ -15,17 +15,13 @@ module Pod
# The native targets associated which should be integrated
# The native targets associated which should be integrated
# with the Pod bundle.
# with the Pod bundle.
#
#
# @return [Bool] whether any changes to the project were made.
#
def
self
.
integrate
(
pod_bundle
,
targets
)
def
self
.
integrate
(
pod_bundle
,
targets
)
changes
=
false
targets
.
each
do
|
target
|
targets
.
each
do
|
target
|
target
.
build_configurations
.
each
do
|
config
|
target
.
build_configurations
.
each
do
|
config
|
changes
=
true
if
update_to_cocoapods_0_34
(
pod_bundle
,
targets
)
update_to_cocoapods_0_34
(
pod_bundle
,
targets
)
changes
=
true
if
set_target_xcconfig
(
pod_bundle
,
target
,
config
)
set_target_xcconfig
(
pod_bundle
,
target
,
config
)
end
end
end
end
changes
end
end
private
private
...
@@ -42,13 +38,10 @@ module Pod
...
@@ -42,13 +38,10 @@ module Pod
# @param [Array<XcodeProj::PBXNativeTarget>] targets
# @param [Array<XcodeProj::PBXNativeTarget>] targets
# The native targets.
# The native targets.
#
#
# @return [Bool] whether any changes to the project were made.
#
# @todo This can be removed for CocoaPods 1.0
# @todo This can be removed for CocoaPods 1.0
#
#
def
self
.
update_to_cocoapods_0_34
(
pod_bundle
,
targets
)
def
self
.
update_to_cocoapods_0_34
(
pod_bundle
,
targets
)
sandbox
=
pod_bundle
.
sandbox
sandbox
=
pod_bundle
.
sandbox
changes
=
false
targets
.
map
(
&
:project
).
uniq
.
each
do
|
project
|
targets
.
map
(
&
:project
).
uniq
.
each
do
|
project
|
file_refs
=
project
.
files
.
select
do
|
file_ref
|
file_refs
=
project
.
files
.
select
do
|
file_ref
|
path
=
file_ref
.
path
.
to_s
path
=
file_ref
.
path
.
to_s
...
@@ -64,10 +57,7 @@ module Pod
...
@@ -64,10 +57,7 @@ module Pod
file_ref
.
remove_from_project
file_ref
.
remove_from_project
end
end
end
end
changes
=
true
unless
file_refs
.
empty?
end
end
changes
end
end
# Creates a file reference to the xcconfig generated by
# Creates a file reference to the xcconfig generated by
...
@@ -83,15 +73,16 @@ module Pod
...
@@ -83,15 +73,16 @@ module Pod
# @param [Xcodeproj::XCBuildConfiguration] config
# @param [Xcodeproj::XCBuildConfiguration] config
# The build configuration.
# The build configuration.
#
#
# @return [Boolean] Indicates whether or not any changes were made.
#
def
self
.
set_target_xcconfig
(
pod_bundle
,
target
,
config
)
def
self
.
set_target_xcconfig
(
pod_bundle
,
target
,
config
)
path
=
pod_bundle
.
xcconfig_relative_path
(
config
.
name
)
path
=
pod_bundle
.
xcconfig_relative_path
(
config
.
name
)
group
=
config
.
project
[
'Pods'
]
||
config
.
project
.
new_group
(
'Pods'
)
group
=
config
.
project
[
'Pods'
]
||
config
.
project
.
new_group
(
'Pods'
)
file_ref
=
group
.
files
.
find
{
|
f
|
f
.
path
==
path
}
file_ref
=
group
.
files
.
find
{
|
f
|
f
.
path
==
path
}
if
config
.
base_configuration_reference
&&
existing
=
config
.
base_configuration_reference
config
.
base_configuration_reference
!=
file_ref
unless
xcconfig_includes_target_xcconfig?
(
config
.
base_configuration_reference
,
path
)
if
existing
&&
existing
!=
file_ref
if
existing
.
real_path
.
to_path
.
start_with?
(
pod_bundle
.
support_files_dir
.
to_path
)
existing
.
path
=
path
elsif
!
xcconfig_includes_target_xcconfig?
(
config
.
base_configuration_reference
,
path
)
UI
.
warn
'CocoaPods did not set the base configuration of your '
\
UI
.
warn
'CocoaPods did not set the base configuration of your '
\
'project because your project already has a custom '
\
'project because your project already has a custom '
\
'config set. In order for CocoaPods integration to work at '
\
'config set. In order for CocoaPods integration to work at '
\
...
@@ -102,9 +93,7 @@ module Pod
...
@@ -102,9 +93,7 @@ module Pod
elsif
config
.
base_configuration_reference
.
nil?
||
file_ref
.
nil?
elsif
config
.
base_configuration_reference
.
nil?
||
file_ref
.
nil?
file_ref
||=
group
.
new_file
(
path
)
file_ref
||=
group
.
new_file
(
path
)
config
.
base_configuration_reference
=
file_ref
config
.
base_configuration_reference
=
file_ref
return
true
end
end
false
end
end
private
private
...
...
spec/unit/installer/user_project_integrator/target_integrator_spec.rb
View file @
0ffb7a6b
...
@@ -36,7 +36,6 @@ module Pod
...
@@ -36,7 +36,6 @@ module Pod
end
end
it
'allows the xcconfig integrator to edit already integrated targets if needed'
do
it
'allows the xcconfig integrator to edit already integrated targets if needed'
do
@target_integrator
.
stubs
(
:native_targets_to_integrate
).
returns
([])
TargetIntegrator
::
XCConfigIntegrator
.
expects
(
:integrate
).
with
(
@pod_bundle
,
[
@target
])
TargetIntegrator
::
XCConfigIntegrator
.
expects
(
:integrate
).
with
(
@pod_bundle
,
[
@target
])
@target_integrator
.
integrate!
@target_integrator
.
integrate!
end
end
...
@@ -123,11 +122,10 @@ module Pod
...
@@ -123,11 +122,10 @@ module Pod
it
'does not perform the integration if there are no targets to integrate'
do
it
'does not perform the integration if there are no targets to integrate'
do
Installer
::
UserProjectIntegrator
::
TargetIntegrator
::
XCConfigIntegrator
.
Installer
::
UserProjectIntegrator
::
TargetIntegrator
::
XCConfigIntegrator
.
integrate
(
@pod_bundle
,
@target_integrator
.
send
(
:native_targets
))
integrate
(
@pod_bundle
,
@target_integrator
.
send
(
:native_targets
))
@target_integrator
.
stubs
(
:native_targets_to_integrate
).
returns
([])
@target_integrator
.
stubs
(
:native_targets
).
returns
([])
@target_integrator
.
expects
(
:add_pods_library
).
never
frameworks
=
@target_integrator
.
send
(
:user_project
).
frameworks_group
.
children
@target_integrator
.
expects
(
:add_copy_resources_script_phase
).
never
@target_integrator
.
send
(
:user_project
).
expects
(
:save
).
never
@target_integrator
.
integrate!
@target_integrator
.
integrate!
@target_integrator
.
send
(
:user_project
).
frameworks_group
.
children
.
should
==
frameworks
end
end
it
'adds an embed frameworks build phase if frameworks are used'
do
it
'adds an embed frameworks build phase if frameworks are used'
do
...
@@ -204,14 +202,7 @@ module Pod
...
@@ -204,14 +202,7 @@ module Pod
describe
'Private helpers'
do
describe
'Private helpers'
do
it
'returns the native targets associated with the Pod bundle'
do
it
'returns the native targets associated with the Pod bundle'
do
@target_integrator
.
send
(
:native_targets
).
map
(
&
:name
).
should
==
%w( SampleProject )
@target_integrator
.
send
(
:native_targets
).
map
(
&
:name
).
should
==
%w( SampleProject )
end
it
'returns the targets that need to be integrated'
do
pods_library
=
@project
.
frameworks_group
.
new_product_ref_for_target
(
'Pods'
,
:static_library
)
@target
.
frameworks_build_phase
.
add_file_reference
(
pods_library
)
@project
.
save
@target_integrator
.
send
(
:native_targets_to_integrate
).
map
(
&
:name
).
should
.
be
.
empty
end
end
it
'is robust against other types of references in the build files of the frameworks build phase'
do
it
'is robust against other types of references in the build files of the frameworks build phase'
do
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment