Maven'den Bazel'e Geçiş

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada, aşağıdakiler de dahil olmak üzere Maven'den Bazel'e nasıl geçiş yapılacağı açıklanmaktadır: yükleme adımlarını anlatacağız. Farklılıkları anlatır ve Guava projesi.

Herhangi bir derleme aracından Bazel'e taşıma yaparken, en iyi seçenek her iki geliştirme ekibinizi tamamen taşıyıncaya kadar birbirine paralel olarak çalışan araçlar CI sistemi ve diğer ilgili sistemler. Maven ve Bazel'i çalıştırmak için olmasını sağlar.

Başlamadan önce

  • Yüklü değilse Bazel'i yükleyin.
  • Bazel'i kullanmaya yeni başladıysanız eğiticiyi inceleyin Başlamadan önce Bazel'e giriş: Java'yı derleme yardımcı olur. Eğiticide Bazel'in kavramları, yapısı ve etiketi açıklanıyor söz dizimine uygun olmalıdır.

Maven ile Bazel arasındaki farklar

  • Maven üst düzey pom.xml dosya kullanır. Bazel birden fazla derlemeyi destekler dosyalar ve BUILD dosyası başına birden fazla hedef oluşturarak artımlı veriler elde etti.
  • Maven, dağıtım sürecinin adımlarından sorumludur. Bazel dağıtımı otomatikleştirmez.
  • Bazel, diller arasındaki bağımlılıkları ifade etmenizi sağlar.
  • Projeye yeni bölümler ekledikçe Bazel’la birlikte bazı yeni bölümler eklemeniz BUILD dosya. En iyi uygulama, her yeni Java paketine bir BUILD dosyası eklemektir.

Maven'den Bazel'e geçiş

Aşağıdaki adımlarda projenizi Bazel'e nasıl taşıyacağınız açıklanmaktadır:

  1. WORKSPACE dosyasını oluşturun
  2. Bir BUILD dosyası oluşturun
  3. Daha fazla BUILD dosyası oluşturun
  4. Bazel kullanarak derleme

Aşağıdaki örnekler, Maven'den Bazel'e Guava projesi. Kullanılan Guava projesi v31.1 tarihinde yayınlandı. Guava'nın kullanıldığı örneklerde her adımda oluşturduğunuz bu dosyalar ve içerikler taşıma işlemi için manuel olarak oluşturulur veya eklenir.

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1. WORKSPACE dosyasını oluşturun

Projenizin kökünde WORKSPACE adlı bir dosya oluşturun. Projeniz harici bağımlılığı yoksa Workspace dosyası boş olabilir.

Projeniz, dizinlerini yüklemek istiyorsanız, çalışma alanında bu harici bağımlılıkları belirtin dosyası olarak kaydedebilirsiniz. Çalışma alanı dosyası için harici bağımlılıkların listesini otomatikleştirmek amacıyla: rules_jvm_external kullanın. Bu kural kümesini kullanma talimatları için şuraya bakın: BENİOKU.

Guava projesi örneği: dış bağımlılıklar

Projenin dış bağımlılıklarını Guava projesi rules_jvm_external kural kümesi oluşturur.

WORKSPACE dosyasına aşağıdaki snippet'i ekleyin:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"

http_archive(
    name = "rules_jvm_external",
    sha256 = RULES_JVM_EXTERNAL_SHA,
    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = [
        "com.google.code.findbugs:jsr305:3.0.2",
        "com.google.errorprone:error_prone_annotations:2.11.0",
        "com.google.j2objc:j2objc-annotations:1.3",
        "org.codehaus.mojo:animal-sniffer-annotations:1.20",
        "org.checkerframework:checker-qual:3.12.0",
    ],
    repositories = [
        "https://repo1.maven.org/maven2",
    ],
)

2. Bir BUILD dosyası oluşturun

Artık çalışma alanınızı tanımladığınıza göre (varsa) projenizin nasıl takip edildiğini açıklamak için BUILD dosyaları oluşturulmalıdır. Tek pom.xml dosyası olan Maven'in aksine, Bazel birçok Proje derlemek için BUILD dosya. Bu dosyalar birden fazla derleme hedefi belirtiyor. Bu da Bazel'ın artımlı derlemeler üretmesine olanak tanır.

BUILD dosyayı aşamalar halinde ekleyin. Bir BUILD dosyası ekleyerek başlayın kökünü oluşturmak ve Bazel'ı kullanarak ilk derlemeyi yapmak için bu kodu kullanmaktır. Ardından, daha ayrıntılı BUILD dosyası ekleyerek derlemenizi hassaslaştırırsınız. belirler.

  1. WORKSPACE dosyanızla aynı dizinde, bir metin dosyası oluşturun ve BUILD olarak adlandıralım.

  2. Bu BUILD dosyasında, uygun kuralı kullanarak tek bir hedef oluşturun: bahsedeceğiz. Aşağıda bazı ipuçları verilmiştir:

    • Uygun kuralı kullanın:

      • Tek bir Maven modülüyle proje oluşturmak için java_library kuralı şöyledir:

        java_library(
            name = "everything",
            srcs = glob(["src/main/java/**/*.java"]),
            resources = glob(["src/main/resources/**"]),
            deps = ["//:all-external-targets"],
        )
        
      • Birden fazla Maven modülü olan projeler oluşturmak için java_library kuralı şöyledir:

        java_library(
            name = "everything",
            srcs = glob([
                "Module1/src/main/java/**/*.java",
                "Module2/src/main/java/**/*.java",
                ...
            ]),
            resources = glob([
                "Module1/src/main/resources/**",
                "Module2/src/main/resources/**",
                ...
            ]),
            deps = ["//:all-external-targets"],
        )
        
      • İkili programlar oluşturmak için java_binary kuralını kullanın:

        java_binary(
            name = "everything",
            srcs = glob(["src/main/java/**/*.java"]),
            resources = glob(["src/main/resources/**"]),
            deps = ["//:all-external-targets"],
            main_class = "com.example.Main"
        )
        
    • Özellikleri belirtin:

      • name: Hedefe anlamlı bir ad verin. Yukarıdaki örneklerde, hedefe "her şey" denir.
      • srcs: Projenizdeki tüm .java dosyalarını listelemek için globbing'i kullanın.
      • resources: Projenizdeki tüm kaynakları listelemek için globbing'i kullanın.
      • deps: Projenizin hangi dış bağımlılıklarını üzerine konuşacağız. Örneğin, herkese açık olmayan ve generate_workspace aracını kullanan bağımlılıkları, java_library için generated_java_libraries makrosu.
    • Şu bölüme göz atın: aşağıdaki üst düzey BUILD dosyasının bir örneğini göçü anlamışsınızdır.

  3. Artık projenizin kökünde bir BUILD dosyanız olduğuna göre projenizi planlarken onlardan da emin olmanız gerekir. Komut satırında, çalışma alanı dizininizi oluşturmak için bazel build //:everything kullanın birlikte çalıştık.

    Proje artık Bazel ile başarıyla tamamlanmış durumda. Şunlar gerekir: projenin artımlı derlemelerine olanak tanımak için daha fazla BUILD dosyası ekleyin.

Guava projesi örneği: Bir BUILD dosyasıyla başlama

Guava projesini Bazel'e taşırken başlangıçta bir BUILD dosyası kullanılır tek bir yerde toplamak sizin görevinizdir. Bu ilk BUILD içeriğinin içeriği dosyasını yükleyin:

java_library(
    name = "everything",
    srcs = glob([
        "guava/src/**/*.java",
        "futures/failureaccess/src/**/*.java",
    ]),
    deps = [
        "@maven//:com_google_code_findbugs_jsr305",
        "@maven//:com_google_errorprone_error_prone_annotations",
        "@maven//:com_google_j2objc_j2objc_annotations",
        "@maven//:org_checkerframework_checker_qual",
        "@maven//:org_codehaus_mojo_animal_sniffer_annotations",
    ],
)

3. Daha fazla BUILD dosyası oluşturun (isteğe bağlı)

İlk adımınızı tamamladıktan sonra gördüğünüz gibi Bazel yalnızca bir BUILD file ile çalışıyor. seçeceğiz. Yine de binayı her bir görev için daha küçük Ayrıntılı hedeflere sahip daha fazla BUILD dosyası ekleniyor.

Birden çok hedefe sahip birden fazla BUILD dosyası, derlemenin artmasına yardımcı olur ayrıntı düzeyi sağlar. Böylece:

  • düzenli toplantılar yapmak,
  • paralel olarak yürütülürse
  • ve derlemenin gelecekteki kullanıcılar için daha iyi korunmasını ve
  • Paketler arasındaki hedeflerin görünürlüğü üzerinde kontrol sahibi olmanızı sağlar. Bu da, uygulama ayrıntılarının bulunduğu kitaplıklar gibi, herkese açık API'ler.

Daha fazla BUILD dosyası ekleme ile ilgili ipuçları:

  • Her Java paketine bir BUILD dosyası ekleyerek başlayabilirsiniz. Şununla başlayın: En az bağımlılığa sahip olan ve sizi artıran Java paketleri en fazla bağımlılığı olan paketler olarak düşünebilirsiniz.
  • BUILD dosyaları ekleyip hedef belirlerken bu yeni hedefleri Hedeflerin bunlara bağlı deps bölümü. glob() fonksiyonunun paket sınırlarını geçmediğinden, sayı oranında paket büyür, glob() ile eşleşen dosyalar küçülür.
  • main dizinine BUILD dosyası eklediğinizde BUILD dosyasını ilgili test dizinine ekleyin.
  • Paketler arasında görünürlüğü uygun şekilde sınırlandırmaya dikkat edin.
  • BUILD dosyaları kurulumunuzdaki hataları gidermeyi kolaylaştırmak için şunları kontrol edin: her derleme ekledikçe projenin Bazel ile dosyası olarak kaydedebilirsiniz. Tüm hedeflerinizin oluşturulmaya devam ettiğinden emin olmak için bazel build //... komutunu çalıştırın.

4. Bazel kullanarak derleme

Kurulumu doğrulamak için BUILD dosyaları eklerken Bazel'ı kullanarak oluşturuyorsunuz bahsedeceğim.

İstediğiniz ayrıntı düzeyinde BUILD dosyanız olduğunda Bazel'i kullanabilirsiniz. üretmenize yardımcı olur.