I have recently been building up some relatively large package trees (for example, porting Boost to build with SwiftPM).
The way I do this is that locally I use remote URLs which are relative to the source package. This lets me iterate very quickly without needing to push to an origin. Of course, it doesn’t work when pushing them to an actual SCM server.
However, what if we allowed relative-path URLs to be resolved relative to the origin from which SwiftPM found them? Concretely:
If I have:
and it’s Package.swift has:
dependencies: [.package(url: “../bar”, …)]
then the idea is to make SwiftPM resolve ../bar to be github.com/dunbar/bar, which happens to be exactly what I want.
This even works for absolute path URLs, the other URL components would come from the origin, so I could also reference:
dependencies: [.package(url: “/apple/swift-package-manager”)]
if I wanted to depend on SwiftPM.
One really nice thing about this scheme is that it simplifies mirroring of trees of packages. For example, if I wanted to clone the above examples onto, say, an enterprise SCM server, then as long as I cloned all of them into the same relative organization, I wouldn’t need to rewrite any of the URL references in the packages themselves during the clone.