Bazel包装依赖罐子

时间:2017-09-01 18:48:42

标签: bazel

我正在尝试构建一个相对独立的发布包(让我们说它是一个tarball,但可能是一个RPM / Deb),其中包含我的代码(包含在我的代码中)一个jar),以及我的代码在运行时编译和使用的jar。 (为了简单起见,我们说这些是相同的。)

我有MyPackage(它有一堆.java文件),让我们说它直接依赖于外部罐子A和B,B取决于外部罐子C.我得到A,B和来自maven_jars的C.

我已经设置了这样的规则:

在MyPackage / BUILD中:

java_library(
    name = "MyPackage",
    srcs = glob(["src/main/java/**/*.java"]),
    deps = ["//MyPackage/artifacts:compile_jars"],
)

并在MyPackage / artifacts / BUILD中:

java_library(
    name = "compile_jars",
    visibility = ["//MyPackage:__pkg__"],
    exports = ["libdeps_A", "libdeps_B"]
)
java_library(
    name = "libdeps_A",
    exports = ["@org.someone.A//jar"],
)
java_library(
    name = "libdeps_B",
    exports = ["@org.secondparty.B//jar", ":libdeps_C"],
)
java_library(
    name = "libdeps_C",
    exports = ["@org.thirdperson.C//jar"],
)

但是,构建的libMyPackage.jar(如预期的那样)不包含来自libdeps_ [ABC]的文件,它只包含来自MyPackage的src / main / java中的.class文件。 / p>

我已经有另一个成功使用的规则:MyPackage将它放在我的tarball的lib / dir中。

我的问题是,是否有某种方法来处理来自遍历// MyPackage / artifacts:compile_jars规则的文件集(jar),所以我也可以将它们放在tar存档中。

这看起来与java_binary的_deploy.jar隐式输出目标非常相似。但是,我不认为我可以使用它,因为我的切入点没有"主要"常规。 (它使用的是来自Google Play的onStart)

我当然可以写一些自动化来制作另一种形式的// MyPackage / artifacts:compile_jars目标是MyPackage / artifacts / BUILD中的信息,但是我想知道我是不是 - 发明轮子?

谢谢,肖恩

1 个答案:

答案 0 :(得分:1)

据我所知,没有一个无处不在的工具可以做到这一点。

我们遇到了完全相同的问题(我们创建了一个包含主jar的jar-ball,完整的传递闭包,配置文件等等) - 我们最终做的是编写我们自己的解决方案,其灵感来自{{ 3}}(但是从头开始写,因为我们需要其他功能,不需要他们的一些功能,我们更喜欢scala)。

作为另一个参考,你可以看到rules_scala(JarCreator),它在skylark中实现了一个部署jar(可能它比原生规则更容易复制)。

另一个提示表明这个问题未得到解决是这个bazel问题:_build_deployable