[swift-build-dev] Namespacing SPM modules (was Re: [swift-dev] Right list?)

Jason Dusek jason.dusek at gmail.com
Mon Feb 29 13:33:15 CST 2016


Consider the case where Erica has packages SwiftString, HTMLString,
PGString, IBMString… These modules all have somewhat different dependencies
— so you would not necessarily want to download and build all of them — but
they do form a coherent whole under EricaString. Would this proposal allow
for names like EricaString.Swift, EricaString.HTML and EricaString.IBM?
​

On Mon, 29 Feb 2016 at 10:43 Erica Sadun via swift-build-dev <
swift-build-dev at swift.org> wrote:

>
> On Feb 29, 2016, at 9:59 AM, Daniel Dunbar <daniel_dunbar at apple.com>
> wrote:
>
> Yup!
>
>  - Daniel
>
> On Feb 29, 2016, at 8:53 AM, Erica Sadun <erica at ericasadun.com> wrote:
>
> I'll try writing up a proposal. Does everything work the same for
> swift-build-dev as -evolution?
>
> -- E
>
>
>
> First draft: https://gist.github.com/erica/c6553a5f6f35e7462074
>
> Looking forward to feedback, questions, and corrections. -- E
>
>
> Disambiguating SPM Naming Conflicts
>
>    - Proposal: TBD
>    - Author(s): Erica Sadun <http://github.com/erica>
>    - Status: TBD
>    - Review manager: TBD
>
> <https://gist.github.com/erica/c6553a5f6f35e7462074#introduction>
> Introduction
>
> I propose to modify Swift's SPM PackageDescription to allow developers to
> assign local module names to avoid module conflicts. Namespacing supports a
> decentralized packaging ecosystem that handles the rare case of name
> overlaps without requiring a central package registry.
>
> This proposal was discussed on the Swift-Dev and Swift-Build-Dev lists in
> the "Right List?
> <http://article.gmane.org/gmane.comp.lang.swift.devel/1149>" thread.
> <https://gist.github.com/erica/c6553a5f6f35e7462074#motivation>Motivation
>
> Swift offers a built in mechanism for distinguishing symbol conflicts.
> When working with NSView, I take care to differentiate Swift.print, which
> outputs text to the console or stream from NSView's  print, which creates
> a print job. Swift does not yet offer a solution for conflicting module
> names.
>
> Like many other Swift developers, I have spent considerable time building
> utility packages. Mine use obvious names like SwiftString and
> SwiftCollections. Simple clear naming is a hallmark of Swift design. At
> the same time, this style introduces the possibility of package name
> conflicts.
>
> import SwiftString // mineimport SwiftString // someone else's. oops.
>
> My SwiftString or StringUtility package can't be used alongside someone
> else's SwiftString or StringUtilitypackage. Moving back to Cocoa-style
> ESSwiftString namespacing feels ugly and antithetical to Swift design.
> Swift should encourage recognizable, easy-to-understand module names.
> <https://gist.github.com/erica/c6553a5f6f35e7462074#original-design>Original
> Design
>
> I first considered namespacing using reverse domain naming in Package
> declarations. This offers a traditional approach to identify a module's
> source:
>
> import PackageDescription
>
> let package = Package(
>     name:   "SwiftString"
>     origin: "org.sadun"
> )
>
> Reverse domain names
>
>    - are relatively short
>    - are already well established for Apple app distribution
>    - do not rely on a web address that may change should the repo move
>    - are less likely to conflict with user names across repo hosts
>
> However concise, using reverse domain names bring unnecessary verbiage to
> name conflicts. Consider the following example.
>
> import org.sadun.SwiftString
> import com.other.SwiftString
>
> ...
>
> // Use my implementation of countSyllables
> let count = org.sadun.SwiftString.countSyllables(myString)
>
> In this example, org.sadun.SwiftString.countSyllables places a burden
> both on writing and reading code. Surely there has to be a better solution.
>
> Adapting import statements resolves symbols but has negative side effects:
>
> import org.sadun.SwiftString as SadunString
> import com.other.SwiftString as OtherString
>
> ...
>
> // Use my implementation of countSyllables
> let count = SadunString.countSyllables(myString)
>
>
>    1. This approach requires Swift language modification
>    2. Import redeclarations may be required across multiple files
>
> Joe Groff suggested a simpler approach: allow package manifests to take
> responsibility for mapping dependencies to source-level module names.
> <https://gist.github.com/erica/c6553a5f6f35e7462074#revised-design>Revised
> Design
>
> Under the revised solution, renaming occurs when declaring dependencies.
> This is what package descriptions looks like under the current system:
>
> import PackageDescription
> let package = Package (
>     name: "myutility",
>     dependencies: [
>     .Package(url: "https://github.com/erica/SwiftString.git",
>                  majorVersion: 1),
>     .Package(url: "https://github.com/bob/SwiftString.git",
>                  majorVersion: 1),
>     ]
> )
>
> Under this proposal, the Package dependency gains an optional localName parameter.
> When localName is omitted, a package imports as the name declared in
> Package.name.
>
> import PackageDescription
> let package = Package (
>     name: "myutility",
>     dependencies: [
>     .Package(url: "https://github.com/erica/SwiftString.git",
>                  majorVersion: 1, localName: "SadunString"), // import SadunString
>     .Package(url: "https://github.com/bob/SwiftString.git",
>                  majorVersion: 1, localName: "BobString"), // import BobString
>     .Package(url: https://github.com/erica/SwiftCollections.git",
>                  majorVersion: 1), // import SwiftCollections
>     ]
> )
>
>
> <https://gist.github.com/erica/c6553a5f6f35e7462074#alternatives-considered>Alternatives
> Considered
>
> Swift names should be as simple and elegant as possible without
> overlapping with built-in keywords. Other suggestions brought up
> in-discussion included:
>
>    - Using GitHub or Bitbucket usernames as namespacing prefixes, e.g.
>    erica.SwiftString. This would not be resilient across cross-repo username
>    conflicts.
>    - Using repo URLs to resolve namespacing conflicts. This would be
>    fragile if repos moved and does not address local module name resolution.
>    - Introducing a registration index for packages.
>
>
> _______________________________________________
> swift-build-dev mailing list
> swift-build-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-build-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-build-dev/attachments/20160229/b29fa421/attachment.html>


More information about the swift-build-dev mailing list