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

thislooksfun thislooksfun at repbot.org
Mon Dec 26 13:56:58 CST 2016

(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)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161226/856dd89b/attachment.html>

More information about the swift-evolution mailing list