如何在 scala 中打包特定目录?

问题描述 投票:0回答:2

现在我有如下的 scala 项目目录:

my-project
ᄂsrc/main/scala
   ᄂ com.foo.bar
       ├ foo1
       │  ᄂ (...classes)
       ᄂ foo2

然后我想打包到 jar 文件只是 'com.foo.bar.foo1' 目录文件。 但是如果我使用

sbt package
,sbt 将所有目录都放在 src/main/scala 下。

如果我命令

sbt package

target
ᄂ some-name-package.jar
    ᄂ com.foo.bar
       ├ foo1
       │  ᄂ (...classes)
       ᄂ foo2

我想知道如何包装如下:

target
ᄂ some-specific-package.jar
    ᄂ com.foo.bar
       ├ foo1
          ᄂ (...classes)

但是我无法更改 build.sbt 文件。

如何打包特定目录?

scala jar sbt packaging artifact
2个回答
0
投票

您可以指定

mappings

Compile / packageBin / mappings := {
  val original = (Compile / packageBin / mappings).value
  original.filter {
    case (file, toPath) =>
      toPath.startsWith("com/foo/bar/foo1")
  }
}

https://www.scala-sbt.org/1.x/docs/Howto-Package.html#Modify+the+contents+of+the+package

如何创建自定义包任务以 jar SBT 中的类子集

如何创建自定义“包”任务以在 SBT 中仅包含特定包?


或者,您可以将您的项目分成两个子项目。然后目录结构将是

my-project
ᄂsubproject1
  ᄂsrc/main/scala
     ᄂ com.foo.bar
         ᄂ foo1
            ᄂ (...classes)
ᄂsubproject2
  ᄂsrc/main/scala
     ᄂ com.foo.bar
         ᄂ foo2

build.sbt

lazy val subproject1 = (project in file("subproject1"))
  .dependsOn(...)
  .settings(
    name := "subproject1",
    ...
  )

lazy val subproject2 = (project in file("subproject2"))
  .dependsOn(...)
  .settings(
    name := "subproject2",
    ...
  )

https://www.scala-sbt.org/1.x/docs/Multi-Project.html

然后执行

sbt subproject1/package
就足够了


0
投票

如果不能修改build.sbt文件,可以使用sbt控制台暂时排除特定源打包。以下是您的操作方法:

1 - 启动 sbt 控制台 2 - 在 sbt 控制台内,将源设置设置为仅包含您要打包的源。在您的情况下,仅包括 com.foo.bar.foo1 包:

set sources in Compile := (sources in Compile).value.filter(_.getPath.contains("com/foo/bar/foo1"))

2 - 运行包任务:

package

这将在目标目录中创建一个仅包含 com.foo.bar.foo1 包类的 JAR 文件。请注意,此更改只是暂时的,不会在不同的 sbt 控制台会话中持续存在。你原来的 build.sbt 保持不变。

如果需要再次打包整个项目,只需重启sbt控制台,照常运行打包任务即可。

© www.soinside.com 2019 - 2024. All rights reserved.