Bu sayfada, Windows uyumlu kurallar yazma, taşınabilir kurallar yazmayla ilgili yaygın sorunlar ve bazı çözümler ele alınmaktadır.
Yollar
Sorunlar:
Uzunluk sınırı: Maksimum yol uzunluğu 259 karakterdir.
Windows daha uzun yolları da (32767 karaktere kadar) desteklese de, birçok program alt sınırdır.
İşlemlerde çalıştırdığınız programlar için bunu göz önünde bulundurun.
Çalışma dizini: Ayrıca 259 karakterle sınırlıdır.
İşlemler 259 karakterden uzun bir dizine
cd
olamaz.Büyük/küçük harfe duyarlı olma: Windows yolları büyük/küçük harfe duyarlı değildir, Unix yolları ise büyük/küçük harfe duyarlıdır.
İşlemler için komut satırı oluştururken bunu göz önünde bulundurun.
Yol ayırıcıları: ters eğik çizgidir (
\`), not forward slash (
/`).Bazel, yolları
/
ayırıcılarıyla Unix stilinde depolar. Bazı Windows programları Unix tarzı yollar, diğerleri için uygun değildir. cmd.exe'deki bazı yerleşik komutlar bunları destekler, bazıları desteklemez.Komut oluştururken her zaman
\` separators on Windows: replace
/with
" kullanmak en iyisidir satırların ve ortam değişkenlerinin kullanılmasını sağlar.Mutlak yollar: Eğik çizgiyle (
/
) başlamamalıdır.Windows'daki mutlak yollar
C:\foo\bar.txt
gibi bir sürücü harfi ile başlar. Tek bir dosya sistemi kökü yoktur.Kuralınız bir yolun mutlak olup olmadığını kontrol ediyorsa bunu göz önünde bulundurun. Mutlak yollar genellikle taşınabilir olmadığından kullanılmamalıdır.
Çözümler:
Yolları kısa tutun.
Uzun dizin adları, derinlemesine iç içe yerleştirilmiş dizin yapıları, uzun dosya adları, uzun çalışma alanı kullanmaktan kaçının adları, uzun hedef adları kullanır.
Tüm bunlar işlemlerin yol bileşenlerine dönüşebilir ve yol uzunluğunu tüketebilir limit.
Kısa bir çıkış kökü kullanın.
Bazel çıkışları için kısa bir yol belirtmek üzere
--output_user_root=<path>
işaretini kullanın. İyi fikir yalnızca Bazel çıkışları için bir sürücüye (veya sanal sürücüye) sahip olmaktır (D:\`), and adding this line to your
.bazelrc dosyası gibi:build --output_user_root=D:/
veya
build --output_user_root=C:/_bzl
Bağlantı noktalarını kullanın.
Kavşak, genel anlamda[1] dizin sembolik bağlantılarıdır. Kavşak oluşturmak kolaydır ve uzun yollara sahip dizinlere (aynı bilgisayarda) işaret edebilir. Bir derleme işlemi, yolu kısa ancak hedefi uzun olan bir bağlantı noktası oluşturursa kısa yol sınırına sahip araçlar, bağlantı noktasındaki dizindeki dosyalara erişebilir.
.bat
dosyalarında veya cmd.exe'de aşağıdaki gibi bağlantılar oluşturabilirsiniz:mklink /J c:\path\to\junction c:\path\to\very\long\target\path
[1]: Teknik olarak birleştirmeler sembolik bağlantı değildir ancak derleme işlemleri için birleştirme noktalarını dizin sembolik bağlantıları olarak kabul edebilirsiniz.
İşlemlerdeki / ortamlardaki yollarda
/
yerine `` yazın.Bir işlem için komut satırı veya ortam değişkenleri oluşturduğunuzda, yolları Windows stili. Örnek:
def as_path(p, is_windows): if is_windows: return p.replace("/", "\\") else: return p
Ortam değişkenleri
Sorunlar:
Büyük/küçük harfe duyarlılık: Windows ortam değişkeni adları büyük/küçük harfe duyarlı değildir.
Örneğin, Java'da
System.getenv("SystemRoot")
veSystem.getenv("SYSTEMROOT")
aynı sonucu verir. (Bu durum diğer diller için de geçerlidir.)Hermetiklik: İşlemler mümkün olduğunca az özel ortam değişkeni kullanmalıdır.
Ortam değişkenleri, işlemin önbellek anahtarının bir parçasıdır. Bir işlem ortam değişkenleri kullanıyorsa veya kullanıcılara özeldir. Bu nedenle, kural daha az önbelleğe alınabilir.
Çözümler:
Ortam değişkeni adlarını yalnızca büyük harflerle kullanın.
Bu özellik Windows, macOS ve Linux'ta çalışır.
İşlem ortamlarını en aza indirin.
ctx.actions.run
kullanırken ortamıctx.configuration.default_shell_env
olarak ayarlayın. İşlemin daha fazla ortam değişkenine ihtiyacı varsa hepsini bir sözlüğe koyun ve sözlüğü işleme iletin. Örnek:load("@bazel_skylib//lib:dicts.bzl", "dicts") def _make_env(ctx, output_file, is_windows): out_path = output_file.path if is_windows: out_path = out_path.replace("/", "\\") return dicts.add(ctx.configuration.default_shell_env, {"MY_OUTPUT": out_path})
İşlemler
Sorunlar:
Yürütülebilir çıkışlar: Yürütülebilir her dosyanın yürütülebilir bir uzantısı olmalıdır.
En yaygın uzantılar
.exe
(ikili dosyalar) ve.bat
(toplu komut dosyaları) şeklindedir.Kabuk komut dosyalarının (
.sh
) Windows'da yürütülebilir OLMADIĞINI unutmayın; bunlarıctx.actions.run
adlı kullanıcınınexecutable
cihazı. Ayrıca, dosyaların sahip olabileceği+x
izni olmadığından Linux'ta olduğu gibi rastgele dosyaları çalıştıramazsınız.Bash komutları: Taşınabilirlik için Bash komutlarını doğrudan işlemlerde çalıştırmaktan kaçının.
Bash, Unix benzeri sistemlerde yaygın olarak kullanılır ancak genellikle Windows'ta kullanılamaz. Bazel, Bash'e (MSYS2) giderek daha az ihtiyaç duyuyor. Bu nedenle, gelecekte kullanıcıların Bazel ile birlikte MSYS2'yi yükleme olasılığı azalacaktır. Windows'da kuralların kullanımını kolaylaştırmak için işlemlerde Bash komutları çalıştırmaktan kaçının.
Satır sonları: Windows CRLF (
\r\n
) kullanır, Unix benzeri sistemler ise LF (\n
) kullanır.Metin dosyalarını karşılaştırırken bunu göz önünde bulundurun. Git ayarlarınıza, özellikle de satıra dikkat edin durumlarda ödeme yapmayı veya taahhütlerinizi tamamlamayı unutmayın. (Git'in
core.autocrlf
ayarına bakın.)
Çözümler:
Bash içermeyen, özel olarak tasarlanmış bir kural kullanın.
native.genrule()
, Bash komutları için bir sarmalayıcıdır ve genellikle basit sorunları çözmek için kullanılır Örneğin dosya kopyalama veya metin dosyası yazma gibi. Tek bir anahtar kelime kullanarak Bash’e güvenmekten tekerlek): bazel-skylib'in ihtiyaçlarınız için özel bir kural olup olmadığına bakın. Bunların hiçbiri Windows'ta derlenirken/test edilirken Bash'e bağlı değildir.Derleme kuralı örnekleri:
copy_file()
(kaynak, dokümanlar): bir dosyayı başka bir yere kopyalar ve isteğe bağlı olarak yürütülebilir hale getirirwrite_file()
(kaynak, dokümanlar): isteğe bağlı olarak, istenen satır sonlarıyla (auto
,unix
veyawindows
) bir metin dosyası yazarsa Yürütülebilir hale getirmek (bir komut dosyasıysa)run_binary()
(kaynak, dokümanlar): derleme işlemi olarak belirtilen girişler ve beklenen çıkışlara sahip bir ikili program (veya*_binary
kuralı) çalıştırır (bu,ctx.actions.run
için bir derleme kuralı sarmalayıcıdır)native_binary()
(kaynak, dokümanlar): , bir*_binary
kuralında yerel ikili programı sarmalar. Bu kuralıbazel run
veyarun_binary()
içinde kullanabilirsiniz.tool
özelliği veyanative.genrule()
tools
özelliği
Test kuralı örnekleri:
diff_test()
(source, documentation): iki dosyanın içeriğini karşılaştıran testnative_test()
(source, documentation): yerel bir ikili dosyayı*_test
kuralına sarmalayarakbazel test
Windows'ta, önemsiz işlemler için
.bat
komut dosyalarını kullanabilirsiniz..sh
komut dosyası yerine,.bat
komut dosyasıyla basit görevleri çözebilirsiniz.Örneğin, hiçbir şey yapmayan, bir iletiyi yazdıran ya da sabit bir hata kodu varsa basit bir
.bat
dosyası yeterli olur. Kuralınız birDefaultInfo()
sağlayıcı döndürüyorsaexecutable
alanı Windows'daki.bat
dosyasını referans alabilir.Dosya uzantıları macOS ve Linux'ta önemli olmadığından,
.bat
uzantısından yararlanın.Boş
.bat
dosyalarının yürütülemeyeceğini unutmayın. Boş bir komut dosyasına ihtiyacınız varsa bir boşluk yazın inceleyebilirsiniz.Bash'i prensipli bir şekilde kullanın.
Starlark derleme ve test kurallarında, Bash komut dosyalarını ve Bash'i çalıştırmak için
ctx.actions.run_shell
kullanın komutları işlem olarak gösterir.Starlark makrolarında Bash komut dosyalarını ve komutlarını
native.sh_binary()
veyanative.genrule()
içine alın. Bazel, Bash'in kullanılabilir olup olmadığını kontrol eder ve komut dosyasını veya Bash.Starlark deposu kurallarında Bash'ten tamamen kaçının. Bazel şu anda depo kurallarında Bash komutlarını prensipli bir şekilde çalıştırmanın bir yolunu sunmuyor.
Dosyalar siliniyor
Sorunlar:
Dosyalar açıkken silinemez.
Açık dosyalar silinemez (varsayılan olarak), denemeler "Erişim Reddedildi" ile sonuçlanır hatalar. Bir dosyayı silemiyorsanız dosyayı açık tutan çalışan bir işlem olabilir.
Çalışmakta olan bir sürecin çalışma dizini silinemez.
İşlemlerin çalışma dizinlerine açık bir herkese açık kullanıcı adı vardır ve işlem sona erene kadar dizin silinemez.
Çözümler:
Kodu yazarken dosyaları hemen kapatmaya çalışın.
Java'da
try-with-resources
kullanın. Python'dawith open(...) as f:
kullanın. Prensip olarak, mümkün olduğunca kısa sürede kapatmalısınız.