[swift-evolution] [SwiftPM] Proposal: Add support for test-only dependencies

Xiaodi Wu xiaodi.wu at gmail.com
Tue Dec 27 18:01:59 CST 2016


The need for a feature such as this was pointed out some time ago. A
proposal to allow dependencies to be declared with increased granularity
has already been written, reviewed, and accepted! Here it is:
https://github.com/apple/swift-evolution/blob/master/proposa
ls/0146-package-manager-product-definitions.md

According to the authors, the proposal was meant to be a more general
solution that enables specifying test dependencies as well as other use
cases:
https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20161114/000735.html

The proposal came up for review, received no feedback, and was accepted
as-is.


On Tue, Dec 27, 2016 at 5:41 PM, thislooksfun via swift-evolution <
swift-evolution at swift.org> wrote:

> Does anyone else have any thoughts on this, or should I go ahead an
> assemble a PR?
>
> -thislooksfun (tlf)
>
> On Dec 26, 2016, at 1:56 PM, thislooksfun <thislooksfun at repbot.org> wrote:
>
> (I think this is the right place for this suggestion, but please let me
> know if I'm mistaken)
>
> There is currently no supported way to have some dependencies only used
> for testing (`swift test`), and the workarounds for it, while workable, are
> unnecessary crude.
>
> Currently, what a lot of projects are doing is defining a
> `.Package.test.swift` file that is then copied over `Package.swift` when
> tests are to be run (on external CI, for example). While this works, it
> adds a extra step and another point of failure (if you forget to add a new
> dependency to both `Package` files, for example.
>
> What I propose is a new section of `Package.swift`, labelled either
> `testDependencies` or `devDependencies`, and the modules referenced within
> are only loaded/compiled when running `swift test`
>
> // Package.swift
> import PackageDescription
> let package = Package(
>     name: "Project",
>     targets: [
>       Target(name: "BoxioDebug", dependencies: ["Core"]),
>     ],
>     dependencies: [	//Same as before
>     ],
>     testDependencies: [
>         .Package(url: "https://github.com/FooBar/PackageOnlyNeededForTesting.git", majorVersion: 1),
>     ]
> )
>
>
> This solves having to manually switch out Package files or `.Package`
> statements inside one Package file when trying to run tests, and keeps all
> dependencies neatly organized in one file.
>
> This change is purely additive and optional, no existing code needs to
> change for this to be added.
>
> A real world example is a dependency on Quick (or another such testing
> framework), that itself uses XCTest, and thus crashes when being run
> outside of `swift test` (add Quick to Package.swift, run `swift build` and
> run the compiled binary). With the new `test[dev]Dependencies`, running
> `swift build` wouldn't even see Quick, and thus would compile and run
> correctly, but `swift test` would both see and use Quick for running the
> test suite.
>
>
> *Other solutions considered:*
> Another potential solution is to only compile the dependencies that were
> actually used when running `swift build`, since that seems to be the cause
> of the above problem.
>
>
> -thislooksfun (tlf)
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161227/debda661/attachment.html>


More information about the swift-evolution mailing list