On Jan 22, 2015, at 3:58 PM, Lucas Holmquist
<lholmqui(a)redhat.com> wrote:
good info,
i’d vote for the b approach so not to interfere with existing stuff.
If someone wasn’t using cocoa pods, how would this affect them, wrt to the “import”
since it wouldn’t be using he module_name pod spec directive?
oh yeap without cocoapods the user will continue to use the same directive, no affects
there, that is:
--
import AeroGearPush
—
> On Jan 22, 2015, at 8:01 AM, Christos Vasilakis <cvasilak(a)gmail.com
<mailto:cvasilak@gmail.com>> wrote:
>
> Hi team,
>
> a little heads up on an issue that I‘ve been looking the last days, on how to proper
support both an Obj-C and a Swift library (in-parallel) on Cocoapods. There was a
discussion on the cocoapods issues tracker[1] basically around two ideas:
>
> a) being a separate project, with a new name plus utilising Swift specific language
propers.
> b) having one project, utilising cocoapods subspec mechanism to include specific
files per spec requested. In a nutshell users will employ in their Podfile something of a
form:
>
> —
> pod “MyFooBarLibrary/Objc’ (objective-c)
> or
> pod “ MyFooBarLibrary/Swift’ (Swift)
> —
>
> Solution (b) was intrigued and went on to discover more, since I haven’t used before
the subspec mechanism and was a good opportunity to learn. The issue mentioned two
projects, QueryKit[2] and ReactiveCocoa[3] (their Swift branch) that utilise this
mechanism, so I dive in trying to see how it works.
>
> My realisations:
> a) both projects are designed with ‘Swift first’ approach, employing _some_
'Objective-C code’ to ease the interaction in a mixed project e.g Objective-C code
calling the ‘Swift’ library, see [4] where the author describes more details on this.
> b) since ‘Swift first’, both produce frameworks where they can be integrated either
in objective-c or swift language projects, no ‘static-library’ targets.
> c) both are designed for iOS >= 8.0
>
> To make it short and from my understanding, the projects are _not_ designed around
the idea of: take either the Objective-C or the Swift port in you project, but instead
employ an Objective-C subspec to “ease” the interaction in a mixed environment, aka
Objective-C code calling the Swift library.
>
> Regardless and to better understand, I did some testing with our push-sdk:
>
> a) having a single Swift Project employing both the objective-c code and Swift code
> b) having a .workspace with a) Obj-c xcodeproj, b) Swift xcodeproj.
>
> In both cases, this mixed approaches, at the end caused issues and wasn’t able to
generate a proper solution. Issues around a) cocoapods 'pod install’ steps, b) tests
on the library are done with two different dependencies c) various other integration
issues…
>
> It’s my sense, the most clean way is to go with separate libraries, that is solution
(a) described above (a solution proposed also from @orta [5]) This has the added benefit
of cleaner 'logistics’ that is: commit history, releases, static/framework library
generations etc etc.
>
> But there is one issue if we go with separate approach: _cocoapods naming_, that is
how to properly separate between the two.
>
> Currently searching for AeroGear-Push in
cocoapods.org <
http://cocoapods.org/>
site we get the following:
>
> <Screenshot 2015-01-22 13.56.36.png>
>
>
> In my cocoapods PR [6] I went with the approach to name the ‘Swift’ equivalent
library as 'AeroGear-Push-Swift’, so the same searching above will reveal:
>
> —
> AeroGear-Push
> AeroGear-Push-Swift
> —
>
> Some of you have already noticed, that the ‘hyphen’ character as a podspec name
doesn’t work well with a Swift Project, cause the podspec name is used as the name of the
final #import statement the user does. That is the following import statement doesn’t
work:
>
> —
> import AeroGear-Push-Swift
> —
>
> Solving this, there are two approaches:
>
> a) rename both library podspecs : Objective-C to -> AeroGearPush and Swift to
-> AeroGearPushSwift
> b) continue the same naming, but use the new ‘module_name’ podspec directive in the
Swift project(added in cocoapods [6]) to specify the final module name the user will use
on the import. That is the approach I have taken in my PR[6]
>
> If we go with (b) the entries will look like this:
>
> ——
> Obj-c: (no changes needed)
>
> Podfile: pod 'AeroGear-Push’
>
> Class: #import <AeroGearPush/AeroGearPush.h>
>
>
> Swift:
>
> Podfile: pod 'AeroGear-Push-Swift’
>
> Class: import “AeroGearPush” (notice _no_ ‘Swift’ postfix is needed cause of the
‘module_name’ override)
>
> ——
>
> I am fine with both albeit more towards (b) mostly not to break existing ‘pod
installs’ the users may use and since support with the ‘module_name’ directive is provided
from cocoapods. Current PR[6] goes with this approach.
>
> Let me know your comments and suggestions
>
> Thanks
> Christos
>
> [1]
https://github.com/CocoaPods/CocoaPods/issues/3016
<
https://github.com/CocoaPods/CocoaPods/issues/3016>
> [2]
https://github.com/QueryKit/QueryKit
<
https://github.com/QueryKit/QueryKit>
> [3]
https://github.com/ReactiveCocoa/ReactiveCocoa/tree/swift-development
<
https://github.com/ReactiveCocoa/ReactiveCocoa/tree/swift-development>
> [4]
https://github.com/CocoaPods/CocoaPods/issues/3016#issuecomment-69092100
<
https://github.com/CocoaPods/CocoaPods/issues/3016#issuecomment-69092100>
> [5]
https://github.com/CocoaPods/CocoaPods/issues/3016#issuecomment-69073109
<
https://github.com/CocoaPods/CocoaPods/issues/3016#issuecomment-69073109>
> [6]
https://github.com/aerogear/aerogear-ios-push/pull/41
<
https://github.com/aerogear/aerogear-ios-push/pull/41>
> [7]
http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/
<
http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/>_...
> aerogear-dev mailing list
> aerogear-dev(a)lists.jboss.org <mailto:aerogear-dev@lists.jboss.org>
>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
_______________________________________________
aerogear-dev mailing list
aerogear-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/aerogear-dev