Skip to content

Commit e7a0760

Browse files
grabboufacebook-github-bot
authored andcommitted
feat(ios): ability to link local spm packages (facebook#54405)
Summary: While working on local project in monorepo, I found that `spm_dependency` utility available in CocoaPods does not support local SPM packages, assuming they always come from remote. This change extends it so that `url` can also be a local path: ```ruby spm_dependency(s, url: File.join(__dir__, 'shared'), requirement: {}, products: ['FooModule'] ) ``` In the above example, `shared` folder contains a SPM project. I don't have opinions on the API design here, I am also happy to create `spm_local_dependency` utility in order to clean up the API design. ## Changelog: [iOS] - Allow linking local SPM packages in CocoaPods Test Plan: Add local Swift Package to your CocoaPods podspec, then run `pod install`. You should see the project in your Xcode. Reviewed By: cipolleschi Differential Revision: D86208056 Pulled By: sbuggay
1 parent dcee4b9 commit e7a0760

File tree

1 file changed

+28
-10
lines changed
  • packages/react-native/scripts/cocoapods

1 file changed

+28
-10
lines changed

packages/react-native/scripts/cocoapods/spm.rb

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,38 @@ def log_warning(msg)
6262
end
6363

6464
def clean_spm_dependencies_from_target(project, new_targets)
65-
project.root_object.package_references.delete_if { |pkg| (pkg.class == Xcodeproj::Project::Object::XCRemoteSwiftPackageReference) }
65+
project.root_object.package_references.delete_if { |pkg|
66+
(pkg.class == Xcodeproj::Project::Object::XCRemoteSwiftPackageReference) ||
67+
(pkg.class == Xcodeproj::Project::Object::XCLocalSwiftPackageReference)
68+
}
6669
end
6770

6871
def add_spm_to_target(project, target, url, requirement, products)
69-
pkg_class = Xcodeproj::Project::Object::XCRemoteSwiftPackageReference
70-
ref_class = Xcodeproj::Project::Object::XCSwiftPackageProductDependency
71-
pkg = project.root_object.package_references.find { |p| p.class == pkg_class && p.repositoryURL == url }
72-
if !pkg
73-
pkg = project.new(pkg_class)
74-
pkg.repositoryURL = url
75-
pkg.requirement = requirement
76-
log(" Adding package to workspace: #{pkg.inspect}")
77-
project.root_object.package_references << pkg
72+
# Determine if this is a local path or remote URL
73+
is_local_path = File.exist?(url)
74+
75+
if is_local_path
76+
pkg_class = Xcodeproj::Project::Object::XCLocalSwiftPackageReference
77+
pkg = project.root_object.package_references.find { |p| p.class == pkg_class && p.relative_path == url }
78+
if !pkg
79+
pkg = project.new(pkg_class)
80+
pkg.relative_path = url
81+
log(" Adding local package to workspace: #{pkg.inspect}")
82+
project.root_object.package_references << pkg
83+
end
84+
else
85+
pkg_class = Xcodeproj::Project::Object::XCRemoteSwiftPackageReference
86+
pkg = project.root_object.package_references.find { |p| p.class == pkg_class && p.repositoryURL == url }
87+
if !pkg
88+
pkg = project.new(pkg_class)
89+
pkg.repositoryURL = url
90+
pkg.requirement = requirement
91+
log(" Adding remote package to workspace: #{pkg.inspect}")
92+
project.root_object.package_references << pkg
93+
end
7894
end
95+
96+
ref_class = Xcodeproj::Project::Object::XCSwiftPackageProductDependency
7997
products.each do |product_name|
8098
ref = target.package_product_dependencies.find do |r|
8199
r.class == ref_class && r.package == pkg && r.product_name == product_name

0 commit comments

Comments
 (0)