(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
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to