0

ネイティブ ランタイムで JavaScript を実行する Kotlin JVM プロジェクトがあります。現在、さまざまな言語ソースが個別のリポジトリで定義されており、JS ファイルは webpacked であり、JVM プロジェクトの依存関係として指定される JAR としてパッケージ化されています。これは問題なく機能しますが、2 つのリポジトリは本質的に結合されているため、マージしたいと考えています。さまざまなビルド ツールを豊富に維持するよりも、Bazel のような多言語ビルド システムを学習して使用する良い機会になると思いました。

現在の構造:

プロジェクトのファイル構造

基本的に、ビルドしようとしている主なパッケージは 2 つあります。Web パッケージは正しくビルドされ、コマンド ラインから Webpacked の出力を表示できます。BUILD全体像の Web ファイルを含めます。

load("@npm_bazel_typescript//:index.bzl", "ts_library")

ts_library(
    name = "compileCore",
    srcs = ["index.ts"],
    tsconfig = "tsconfig.json",
)

filegroup(
    name = "internalCore",
    srcs = ["compileCore"],
    output_group = "es5_sources",
)

load("@npm//webpack-cli:index.bzl", webpack = "webpack_cli")

webpack(
    name = "bundle",
    outs = ["bundle.prod.js"],
    args = [
        "--mode production",
        "$(execpath internalCore)",
        "--config",
        "$(execpath webpack.config.js)",
        "-o",
        "$@",
    ],
    data = [
        "internalCore",
        "webpack.config.js",
        "@npm//:node_modules",
    ],
    visibility = ["//visibility:public"],
)

もう 1 つの重要なパッケージは、ネストされた//jvm/src/main/java/com/example/bazel/pluginパッケージです。これは基本的に最終成果物であり、Web パッケージの出力がリソースとして含まれる JAR である必要があります。

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library")

kt_jvm_library(
    name = "plugin",
    srcs = glob(["*.kt"]),
    deps = [
        # ... some deps
    ],
    resources = ["//web:bundle"],
    visibility = ["//visibility:public"],
)

これは一見簡単ですが、ビルド中に次のエラーが発生します。

❯ bazel build //jvm/src/...
INFO: Analyzed target //jvm/src/main/java/com/example/bazel/plugin:plugin (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
ERROR: /Users/jzucker/dev/GitHub/plugin-example-bazel/jvm/src/main/java/com/example/bazel/plugin/BUILD:12:15: error executing shell command: '/bin/bash -c external/bazel_tools/tools/zip/zipper/zipper c bazel-out/darwin-fastbuild/bin/jvm/src/main/java/com/example/bazel/plugin/plugin-resources.jar @bazel-out/darwin-fastbuild/bin/jvm/src/ma...' failed (Exit 255) bash failed: error executing command /bin/bash -c ... (remaining 1 argument(s) skipped)

Use --sandbox_debug to see verbose messages from the sandbox
File web/bundle.prod.js does not seem to exist.Target //jvm/src/main/java/com/example/bazel/plugin:plugin failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 0.402s, Critical Path: 0.05s
INFO: 0 processes.
FAILED: Build did NOT complete successfully

いくつかの実験の後、これは、生成された出力を のリソースとしてバンドルしようとする問題のようですkt_jvm_library。リソースが別のパッケージの具体的なソース ファイルを参照している場合、問題なく機能します。ここでの主な問題は、これが Bazel にとって適切なパターンなのか、それとも私がこの技術を悪用しようとしているのかということです。これは比較的単純な使用例のように思えますが、私が最も懸念するドキュメントの行があります。

すべてのルールの不変条件は、ルールによって生成されたファイルが常にルール自体と同じパッケージに属していることです。ファイルを別のパッケージに生成することはできません。ただし、ルールの入力が別のパッケージから取得されることは珍しくありません。

https://docs.bazel.build/versions/master/build-ref.htmlから

どんな洞察も大歓迎です。

4

1 に答える 1