Запустите mvn как инструмент в сборке базеля - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть хитрый модуль в моем проекте, который (пока) не может быть построен нигде, кроме Maven. Хорошо, что у этого модуля нет Java зависимостей в моем проекте, и он создает только файл .war, который мне нужно переместить в правильное место в выходном zip-дистрибутиве.

I хочу перенести сборку на bazel, но я хочу заняться сложным модулем на более позднем этапе миграции.

Как запустить mvn в качестве инструмента в моей сборке bazel, чтобы он мог создавать .war file?

  • Maven ожидает выполнения из каталога, содержащего pom.xml
  • Maven записывает вывод в подкаталог входного файлового дерева
  • Maven наиболее счастлив, когда settings. xml содержит абсолютные пути (к локальному репозиторию maven для .war, хранящемуся в git)
  • Maven использует $ HOME / .m2 для кэширования

Я посмотрел at rules_foreign_ cc, который создает скрипт-оболочку для cmake. Это путь к go? https://github.com/bazelbuild/rules_foreign_cc/blob/8372f383cf7277a88762efe25d8cfee10ad27929/tools/build_defs/framework.bzl#L156

1 Ответ

1 голос
/ 30 апреля 2020

У меня есть mvn_package прототип правила в этом запросе . Вопросы, которые вы подняли, имеют решающее значение; требуется немного времени, чтобы обуздать соглашения и ожидания Maven в более строгой среде выполнения действий Bazel.

Maven ожидает выполнения из каталога, содержащего pom. xml

Вы можете использовать флаг -f, чтобы указать местоположение pom.xml.

например, mvn package -f %s -DskipTests -DbazelOutputDir=%s -Pbazel" % (ctx.file.pom_xml.dirname,output_jar.dirname)

Maven записывает вывод в подкаталог входного файлового дерева

Я создал пользовательский профиль в pom.xml для настраиваемого определения Maven и передал, определяющий указанную выше командную строку:

    <profiles>
        <profile>
            <id>bazel</id>
            <build>
                <directory>${bazelOutputDir}</directory>
            </build>
        </profile>
    </profiles>

Maven наиболее удачлив при настройках. xml содержит абсолютные пути (к локальному репозиторию maven для .war, хранящемуся в git)

Это неудачно, и вам придется найти способ обойти это или отключить песочницу: (

Maven использует $ HOME / .m2 для кэширования

До тех пор, пока входные и выходные данные действия Bazel объявлены правильно в правиле Starlark, вам не нужно взаимодействовать с Maven's .m2 кеш ctory, поскольку Bazel имеет свой собственный кэш действий.

Для полноты изложения приведем доказательство концепции правила Starlark для упаковки .jar, поэтому вам, возможно, потребуется настроить его для .war:

def _mvn_package_impl(ctx):
    inputs = []
    inputs.extend(ctx.files.srcs)
    inputs.append(ctx.file.pom_xml)

    output_jar = ctx.actions.declare_file("target/%s-%s.jar" % (ctx.attr.artifact_id, ctx.attr.version))
    target_dir = ctx.actions.declare_directory("target")
    outputs = [output_jar, target_dir]

    # -Djar.finalName=custom-jar-name
    ctx.actions.run_shell(
        inputs = inputs,
        outputs = outputs,
        mnemonic = "MvnPackage",
        progress_message = "Running 'mvn package' for %s" % output_jar.short_path,
        command = "mvn package -f %s -DskipTests -DbazelOutputDir=%s -Pbazel" % (ctx.file.pom_xml.dirname,output_jar.dirname),
    )

    return [
        DefaultInfo(
            files = depset(outputs),
        ),
        JavaInfo(
            output_jar = output_jar,
            compile_jar = output_jar,
        ),
    ]

mvn_package = rule(
    implementation = _mvn_package_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = True, allow_empty = False),
        "pom_xml": attr.label(allow_single_file = True, mandatory = True),
        "artifact_id": attr.string(mandatory = True),
        "group_id": attr.string(mandatory = True),
        "version": attr.string(mandatory = True),
    },
) 

и используя указанное выше правило в файле BUILD:

load("@rules_jvm_external//:mvn.bzl", "mvn_package")

mvn_package(
    name = "hello_maven",
    srcs = [
        "//src/main/java/hello:srcs",
    ],
    pom_xml = "//:pom.xml",
    group_id = "org.springframework",
    artifact_id = "gs-spring-boot",
    version = "0.1.0",
)

java_binary(
    name = "hello_maven_app",
    runtime_deps = [":hello_maven"],
    main_class = "hello.Application",
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...