[swift-users] Package module name collisions

Erica Sadun erica at ericasadun.com
Mon Feb 1 19:53:03 CST 2016


This is a good reason why package names should be clear and specific, avoiding common phrases and terms that will overlap. 
A proven way to avoid such issues is to namespace your packages in some way, e.g. prefer SadunStringUtilities vs SwiftString.

At this time there is no built-in way that I know of how to deal with module name collisions. So let me speculate about what
a solution might look like. (Skip to the next message if this doesn't interest.) Having a reverse domain name as
part of the Package declaration syntax maybe could address part of the issue, for example:

import PackageDescription

let package = Package(
    name: "SwiftString"
    origin: "com.sadun"
)

and in the case of name conflicts use:

import com.sadun.SwiftString
import com.LeeJason.SwiftString

with all the annoying resolution that might involve in disambiguating symbols.  I could also 
see some kind of package alias being needed if this problem got too bad, e.g.

packagealias Sadun = com.sadun.SwiftString
packagealias LeeJ = com.lLeeJason.SwiftString

let x = LeeJ.countStringItems(someString)

but I don't know how Swift would disambiguate, for example, two packages that both created
 public extensions on String both being imported into the same file, and both offering conflicting, say, properties.

-- Erica


> On Feb 1, 2016, at 6:41 PM, Jason Lee via swift-users <swift-users at swift.org> wrote:
> 
> Today I introduced a dependency on another project's package with brought over a module name that conflicted with one he modules in my project.
> 
> Currently my project has multiple modules (and executables) in the package and everything is working well for me. However, when I got this conflict today, I was thinking this will be a problem going forward. I'm sure it's been solved already by the package manager team, but I haven't figured out how to do this from the docs yet.
> 
> An example:
> Package 'A' has a module named 'Base'
> My package also has a module named 'Base'
> 
> When I build, I get a circular ref error now. One way I was thinking I cld fix this on my end is to prefix all my module names with my package name (seems redundant, of course). Something like 'Base' becomes 'MyAppBase'. And my imports could look like so:
> 
> import Foundation
> import Base
> import MyAppBase
> 
> Any thoughts on this? Thx.
> 
> - jason
> 
> Sent from my iPhone
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160201/b8050287/attachment.html>


More information about the swift-users mailing list