<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">- swift-evolution, + swift-build-dev</div><div class=""><br class=""></div>It might be worth discussing this feature separately from product proposal because IMO the test-only (or local) dependencies should not be considered in dependency resolution. With product proposal we will *not* compile the targets which are not vended by a package but we will still clone and resolve all the dependencies. This means two packages can not depend on conflicting versions of Quick (which might not make sense for local dependencies).<div class=""><br class=""><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 28-Dec-2016, at 5:31 AM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">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:<div class=""><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0146-package-manager-product-definitions.md" target="_blank" style="font-size:12.800000190734863px" class="">https://github.com/apple/swift<wbr class="">-evolution/blob/master/proposa<wbr class="">ls/0146-package-manager-<wbr class="">product-definitions.md</a><div class=""><br class=""></div><div class="">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:</div><div class=""><a href="https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20161114/000735.html" class="">https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20161114/000735.html</a><br class=""></div><div class=""><br class=""></div><div class="">The proposal came up for review, received no feedback, and was accepted as-is.</div><div class=""><br class=""></div><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Dec 27, 2016 at 5:41 PM, thislooksfun via swift-evolution <span dir="ltr" class="">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word" class="">Does anyone else have any thoughts on this, or should I go ahead an assemble a PR?<br class=""><div class="">
<div style="letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; word-wrap: break-word;" class=""><br class="">-thislooksfun (tlf)</div>

</div><div class=""><div class="gmail-h5">
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 26, 2016, at 1:56 PM, thislooksfun &lt;<a href="mailto:thislooksfun@repbot.org" target="_blank" class="">thislooksfun@repbot.org</a>&gt; wrote:</div><br class="gmail-m_-3513457455857881725Apple-interchange-newline"><div class=""><div style="word-wrap:break-word" class=""><div class="">(I think this is the right place for this suggestion, but please let me know if I'm mistaken)</div><div class=""><br class=""></div>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.<div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">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`</div><div class=""><br class=""></div><div class=""><pre style="color:inherit;margin-top:15px;margin-bottom:15px;font-family:menlo,consolas,'liberation mono',courier,monospace;font-size:10pt;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;background-color:rgb(248,248,248);border:1px solid rgb(204,204,204);overflow:auto;padding:4px 8px;word-break:normal;word-wrap:normal" class="">// Package.swift
import PackageDescription
let package = Package(
    name: "Project",
    targets: [
      Target(name: "BoxioDebug", dependencies: ["Core"]),
    ],
    dependencies: [
<span class="gmail-m_-3513457455857881725Apple-tab-span" style="white-space:pre-wrap">        </span>//Same as before
    ],
    testDependencies: [
        .Package(url: "<a href="https://github.com/FooBar/PackageOnlyNeededForTesting.git" target="_blank" class="">https://github.com/FooBar/<wbr class="">PackageOnlyNeededForTesting.<wbr class="">git</a>", majorVersion: 1),
    ]
)
</pre><div class=""><br class="gmail-m_-3513457455857881725webkit-block-placeholder"></div><div class="">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&nbsp;neatly organized in one file.</div><div class=""><br class=""></div><div class="">This change is purely additive and optional, no existing code needs to change for this to be added.</div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><b class="">Other solutions considered:</b></div><div class="">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.</div><div class=""><br class=""></div><div class="">
<div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word" class=""><br class="">-thislooksfun (tlf)</div>

</div>

<br class=""></div></div></div></blockquote></div><br class=""></div></div></div><br class="">______________________________<wbr class="">_________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a><br class="">
<br class=""></blockquote></div><br class=""></div></div></div></div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></div></div></body></html>