Bu sayfa, kurallarını başkalarına sunmayı planlayan kural yazarları içindir.
Barındırma ve adlandırma kuralları
Yeni kurallar, kuruluşunuz dahilindeki kendi GitHub deposuna yerleştirilmelidir. Kurallarınızın bazelbuild kuruluşuna ait olduğunu düşünüyorsanız bazel-dev posta listesiyle iletişime geçin.
Bazel kuralları için depo adları aşağıdaki biçimde standartlaştırılmıştır:
$ORGANIZATION/rules_$NAME
.
GitHub'daki örneklere bakın.
Tutarlılık için Bazel kurallarınızı yayınlarken aynı biçimi kullanmanız gerekir.
Açıklayıcı bir GitHub deposu açıklaması ve README.md
başlığı kullanın. Örnek:
- Kod deposu adı:
bazelbuild/rules_go
- Depo açıklaması: Bazel için Go kuralları
- Depo etiketleri:
golang
,bazel
README.md
üstbilgisi: Bazel için kurallara gidin (Bazel'i bilmeyen kullanıcıları doğru yere yönlendirecek https://bazel.build bağlantısını kullanın)
Kurallar, dile (Scala gibi) veya platforma (ör. Android) göre gruplandırılabilir.
Depo içeriği
Kullanıcıların yeni kuralları hızlı bir şekilde anlayabilmesi için her kural deposunun belirli bir düzeni olmalıdır.
Örneğin, mockascript
dili için yeni kurallar yazarken kural deposu aşağıdaki yapıya sahip olur:
/
LICENSE
README
WORKSPACE
mockascript/
constraints/
BUILD
runfiles/
BUILD
runfiles.mocs
BUILD
defs.bzl
tests/
BUILD
some_test.sh
another_test.py
examples/
BUILD
bin.mocs
lib.mocs
test.mocs
ÇALIŞMA ALANI
Projenin WORKSPACE
bölümünde kullanıcıların kurallarınıza başvurmak için kullanacağı adı tanımlamanız gerekir. Kurallarınız bazelbuild kuruluşuna aitse rules_<lang>
(rules_mockascript
gibi) kullanmanız gerekir. Aksi takdirde, deponuzu <org>_rules_<lang>
olarak adlandırmalısınız (build_stack_rules_proto
gibi). Kurallarınızın bazelbuild kuruluşundaki kurallara uygun olması gerektiğini düşünüyorsanız lütfen bazel-dev posta listesiyle iletişime geçin.
Aşağıdaki bölümlerde, deponun bazelbuild kuruluşuna ait olduğunu varsayın.
workspace(name = "rules_mockascript")
BENİOKU
Üst düzeyde, (en azından) kullanıcıların kuralınızı kullanmak için WORKSPACE
dosyalarına kopyalayıp yapıştırmaları gereken öğeleri içeren bir README
olmalıdır.
Genel olarak bu, GitHub sürümünüzü işaret eden bir http_archive
ve kuralınızın ihtiyaç duyduğu tüm araçları indiren/yapılandıran bir makro çağrısı olacaktır. Örneğin, Go kuralları için bu değer şu şekilde görünür:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_go",
urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz"],
sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329",
)
load("@rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
go_rules_dependencies()
go_register_toolchains()
Kurallarınız başka bir deponun kurallarına bağlıysa bunu kural dokümanlarında belirtin (örneğin, Sass kurallarına bağlı olan Skydoc kurallarına bakın) ve tüm bağımlılıkları indirecek bir WORKSPACE
makrosu sağlayın (yukarıdaki rules_go
bölümüne bakın).
Kurallar
Çoğu zaman deponuz tarafından sağlanan birden fazla kural olur. Dile göre adlandırılmış bir dizin oluşturun ve bir giriş noktası sağlayın - defs.bzl
tüm kuralları dışa aktarın (dizinin paket olması için bir BUILD
dosyası da ekleyin).
rules_mockascript
için bu, mockascript
adında bir dizin ve BUILD
dosyası ile defs.bzl
dosyasının içinde olacağı anlamına gelir:
/
mockascript/
BUILD
defs.bzl
Sınırlamalar
Kuralınız araç zinciri kurallarını tanımlıyorsa özel constraint_setting
ve/veya constraint_value
tanımlamanız gerekebilir. Bunları bir //<LANG>/constraints
paketine yerleştirin. Dizin yapınız aşağıdaki gibi görünecektir:
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
En iyi uygulamalar için lütfen
github.com/bazelbuild/platforms
adresini okuyun ve mevcut kısıtlamaları görmek için
dilden bağımsız olan kısıtlamalarınızı söz konusu kısıtlamalara katkıda bulunmayı düşünün.
Özel kısıtlamalar sunmaya dikkat edin. Kurallarınızın tüm kullanıcıları, BUILD
dosyalarında platforma özel mantık gerçekleştirmek (örneğin, selects kullanarak) için bunları kullanır.
Özel kısıtlamalarla tüm Bazel ekosisteminin konuşacağı bir dil tanımlarsınız.
Runfiles kitaplığı
Kuralınız çalıştırma dosyalarına erişim için standart bir kitaplık sağlıyorsa //<LANG>/runfiles
konumunda bulunan bir kitaplık hedefi (//<LANG>/runfiles:runfiles
adının kısaltması) biçiminde olmalıdır. Veri bağımlılıklarına erişmesi gereken kullanıcı hedefleri, genellikle bu hedefi deps
özelliklerine ekler.
Depo kuralları
Bağımlılıklar
Kurallarınızda dış bağımlılıklar olabilir. Kurallarınıza bağlı olarak süreci kolaylaştırmak için lütfen bu dış bağımlılıklara bağımlılıkları bildirecek bir WORKSPACE
makrosu sağlayın. Burada testlerin bağımlılıklarını belirtmeyin, yalnızca kuralların çalışması için gereken bağımlılıkları bildirin. WORKSPACE
dosyasına geliştirme bağımlılıkları ekleyin.
<LANG>/repositories.bzl
adlı bir dosya oluşturun ve rules_<LANG>_dependencies
adlı tek bir giriş noktası makrosu sağlayın. Dizinimiz aşağıdaki gibi görünür:
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
repositories.bzl
Araç zincirleri kaydediliyor
Kurallarınız araç zincirleri de kaydedebilir. Lütfen bu araç zincirlerini kaydeden ayrı bir WORKSPACE
makrosu sağlayın. Bu sayede kullanıcılar, önceki makroyu atlayıp bağımlılıkları manuel olarak kontrol ederken araç zincirlerini kaydetmeye devam edebilir.
Bu nedenle, <LANG>/repositories.bzl
dosyasına rules_<LANG>_toolchains
adlı bir WORKSPACE
makrosu ekleyin.
Analiz aşamasında araç zincirlerini çözümleyebilmek için Bazel'in kayıtlı tüm toolchain
hedeflerini analiz etmesi gerektiğini unutmayın. Bazel'in toolchain.toolchain
özelliği tarafından referans verilen tüm hedefleri analiz etmesi gerekmez. Araç zincirlerini kaydetmek için depoda karmaşık hesaplamalar yapmanız gerekiyorsa depoyu toolchain
hedefleriyle birlikte, <LANG>_toolchain
hedefleri olan depodan bölmeyi düşünün. Önceki kod her zaman, ikincisi ise yalnızca kullanıcının gerçekten <LANG>
kodu derlemesi gerektiğinde getirilir.
Sürüm snippet'i
Sürüm duyurunuzda, kullanıcılarınızın kopyalayıp WORKSPACE
dosyalarına yapıştırabilecekleri bir snippet sağlayın. Bu snippet, genel olarak aşağıdaki gibi görünür:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_<LANG>",
urls = ["<url_to_the_release.zip"],
sha256 = "4242424242",
)
load("@rules_<LANG>//<LANG>:repositories.bzl", "rules_<LANG>_dependencies", "rules_<LANG>_toolchains")
rules_<LANG>_dependencies()
rules_<LANG>_toolchains()
Testler
Kuralların beklendiği gibi çalıştığını doğrulayan testler olmalıdır. Bu konum, kuralların hedeflendiği dil için standart konumda veya en üst düzeyde bir tests/
dizininde olabilir.
Örnekler (isteğe bağlı)
Kuralların kullanılabileceği birkaç temel yöntemi kullanıcılara gösteren bir examples/
dizininin olması kullanıcılar açısından faydalıdır.
Test
Travis'i başlangıç dokümanlarında açıklandığı şekilde ayarlayın. Sonra aşağıdaki içeriğe sahip bir .travis.yml
dosyasını deponuza ekleyin:
dist: xenial # Ubuntu 16.04
# On trusty (or later) images, the Bazel apt repository can be used.
addons:
apt:
sources:
- sourceline: 'deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8'
key_url: 'https://bazel.build/bazel-release.pub.gpg'
packages:
- bazel
script:
- bazel build //...
- bazel test //...
Deponuz bazelbuild kuruluşu altındaysa ci.bazel.build bölümüne eklemenizi isteyebilirsiniz.
Belgeler
Belgelerin otomatik olarak oluşturulabilmesi için kurallarınızı nasıl yorumlayacağınızla ilgili talimatlar için Stardoc dokümanlarına bakın.
SSS
Kuralımızı neden ana Bazel GitHub deposuna ekleyemiyoruz?
Bazel sürümlerinden mümkün olduğunca kuralları birbirinden ayırmak istiyoruz. Ayrı kuralların kime ait olduğu daha net bir şekilde anlaşılır ve Bazel geliştiricilerinin üzerindeki yük azalır. Ayrıştırma, kullanıcılarımızın kuralları değiştirme, yükseltme, düşürme ve değiştirme işlemlerini kolaylaştırır. Kurallara katkıda bulunmak, kurallara bağlı olarak Bazel'a katkıda bulunmaktan daha hafif olabilir. Buna karşılık gelen GitHub deposuna tam gönderme erişimi de dahildir. Bazel'ın kendisine gönderme erişimi almak çok daha karmaşık bir süreçtir.
Olumsuz tarafı ise kullanıcılarımız için tek seferlik daha karmaşık bir yükleme işlemidir: Yukarıdaki README.md
bölümünde gösterildiği gibi, bir kuralı kopyalayıp WORKSPACE
dosyalarına yapıştırmaları gerekir.
Tüm kurallar Bazel deposunda (//tools/build_rules
veya //tools/build_defs
altında) yer alıyordu. Orada hâlâ birkaç kuralımız var, ancak kalan kuralları kullanımdan kaldırmaya çalışıyoruz.