cocoapods-generate icon indicating copy to clipboard operation
cocoapods-generate copied to clipboard

Support `:podspec` as alternative to `:path` option

Open Legion2 opened this issue 2 years ago • 4 comments

Currently local a podspec can only be included using the --local-sources option which is a directory that may contain multiple podspec files for multiple pod dependencies. This option is used for local dependencies where the source is also local. However to include a library which itself does not have a podspec, a podspec can be created outside a spec repository and refrerenced in the podfile according to https://guides.cocoapods.org/syntax/podfile.html#pod.

If a podspec is available from another source outside of the library’s repository. Consider, for instance, a podspec available via HTTP:

pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'

The :podspec option can also be a local path, however currently pod gen has no option to specify the :podspec for a pod dependency.

Often it is not required to use the :podspec, because the :path option works for local podspecs as well. However, the installation process of :podspec and :path are different, which results in failures. For example the third party podspecs of react-native can not be included with the :path option.

Legion2 avatar Sep 23 '21 14:09 Legion2

If I'm understanding correctly, you'd like to use pod gen to generate a workspace for a remote podspec? Did I get that right? Does it work to have a local podspec w/ a dependency on the remote one (e.g. react-native) and you generate the workspace for both of those? I think we'd need to know more about your specific use case and what problem you're trying to solve by trying to generate a workspace for a remote podspec.

justinseanmartin avatar Sep 29 '21 21:09 justinseanmartin

If I'm understanding correctly, you'd like to use pod gen to generate a workspace for a remote podspec?

No, I would like to generate a workspace given a local podspec which has a dependency on a remote podspec which is not part of a repository.

The use case is, that the kotlin cocoapods integration use pod gen to integrate pods into kotlin. And we want to use react-native which has these podspecs which are not part of a repository. At build time react-native is available on the local machine. However with pod gen it is not possible/no documented how to include a the podspec in the correct way (with the :podspec option in the generated podfile).

Legion2 avatar Sep 29 '21 22:09 Legion2

Do you have any reference material on how the kotlin cocopaods integration is handled?

I've never looked at how react native interfaces with CocoaPods before today, but it looks complicated. I see they're defining these dependencies with podspec instead of path here. I assume this is being done to ensure that the prepare_command is being run.

All that said, it is still unclear to me exactly what functionality you would need to accomplish your goals. The --local-sources option is available for the case where your podspec defines dependencies and you're not using the pod gen podfile config options to manage how to fulfill that dependency.

I'd be happy to take a look at a PR if this was something that you were interested in working on.

justinseanmartin avatar Sep 29 '21 22:09 justinseanmartin

Do you have any reference material on how the kotlin cocopaods integration is handled?

Here is how pod gen is called in the kotlin build task: https://github.com/JetBrains/kotlin/blob/master/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt#L389-L397

Before that the podspec is generated here: https://github.com/JetBrains/kotlin/blob/5c3ce67648c2d5ca9e2a7de4460c6256625fd479/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/CocoapodsTasks.kt#L115-L156

I see they're defining these dependencies with podspec instead of path here. I assume this is being done to ensure that the prepare_command is being run.

Exactly. And because pod gen does not support :podspec it uses :path. Nevertheless, the prepare_command is executed in the directory of the podspec file, however the directory does not contain the sources and fails (the sources must be downloaded from git).

The --local-sources option is available for the case where your podspec defines dependencies

Kotlin uses the --local-sources option, but this results in path instead of podspec in the generated podfile, which causes the error described above.

Using the [pod gen podfile config options(]https://github.com/square/cocoapods-generate/blob/master/lib/cocoapods/generate/configuration.rb#L139-L141) is not an option for the kotlin integration, because it kotlin relies on pod gen to generate the podfile.

I thinks what's needed is an option in pod gen to specify a podspec (url or local path) which should be put into the generated podfile with the podspec option instead of path, to reproduce the expected behavior. e.g. pod 'myPod', :podspec => './external/myPod.podspec' instead of pod 'myPod', :path => './external/'

Legion2 avatar Sep 30 '21 07:09 Legion2