如何从 sbt 中的不同任务中排除库?

How to exclude libraries from different tasks in sbt?

我有以下项目结构:

/
├── project
|   └── ...
├── src
|   └── ... 
├── lib
│   ├── prod-lib.jar
|   └── test-lib.jar
└── build.sbt

我需要使用 test-lib.jar 进行编译以部署到测试环境中,使用 prod-lib.jar 进行编译以部署到生产环境中。

它们都具有相同的 API 来访问我需要的东西,所以我的源代码对它们都没有任何问题,但是它们在如何实现它们的执行方面有细微的差别背景.

有没有办法创建一个 "sbt task"(或者其他任何东西)可以忽略一个 jar 或另一个,但在两者中都执行 assembly任务呢?

将你的 jar 放在不同的文件夹中,并在 CompileTest 范围内相应地设置 unmanagedBase 键:

> set unmanagedBase in Compile := baseDirectory.value / "lib-compile"
> show compile:assembly::unmanagedBase
[info] /project/foo/lib-compile
> set unmanagedBase in Test := baseDirectory.value / "lib-test"
> show test:assembly::unmanagedBase
[info] /project/foo/lib-test

但是不要忘记调用assembly相应范围内的任务(compile:assemblytest:assembly),因为在Global中它仍然是默认的:

> show assembly::unmanagedBase
[info] /project/foo/lib