Bu sayfa, Windows ile uyumlu kurallar, yaygın olarak karşılaşılan sorunlar ve bazı çözümler hakkında bilgi edineceksiniz.
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 programlarla ilgili bu hususa dikkat edin.
Çalışma dizini: Ayrıca 259 karakterle sınırlıdır.
İşlemler, 259 karakterden uzun bir dizin için
cd
işlemi yapamaz.Büyük/küçük harfe duyarlılık: Windows yolları büyük/küçük harfe duyarlı değildir, Unix yolları büyük/küçük harfe duyarlıdır.
İşlemler için komut satırları 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şlamayın.Windows'da mutlak yollar bir sürücü harfiyle başlar (ör.
C:\foo\bar.txt
). Hiçbir bekar kök olacaktır.Kuralınız bir yolun mutlak olup olmadığını kontrol ediyorsa bunu göz önünde bulundurun. Mutlak yollar genellikle taşınabilir olmadıkları için kaçınılmalı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 isterseniz
--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
Kavşakları kullanın.
Kavşaklar, 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. Derleme işlemi yolu kısa ancak hedefi uzun olan bir kavşak kesişim dizindeki dosyaları.
.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]: Tam anlamıyla Kavşaklar sembolik bağlantılar değildir dizin simge bağlantıları olarak kabul edebilirsiniz.
İşlemlerdeki / ortamlardaki yollarda
/
öğesini `` ile değiştirin.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, diğer diller için de geçerlidir.)Hermeticity: İşlemlerde mümkün olduğunca az özel ortam değişkeni kullanılmalı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 harfle 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. Öğe işlemi için daha fazla ortam değişkeni gerekiyor. Bunların tümünü bir sözlüğe yerleştirin ve eyleme geçirin. Ö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
'dır (Toplu komut dosyaları).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 yoktur. Bu nedenle rastgele dosyaları çalıştıramaz.Bash komutları: Taşınabilirlik açısından, Bash komutlarını doğrudan işlemlerde çalıştırmaktan kaçının.
Unix benzeri sistemlerde Bash yaygın olarak kullanılsa da Windows'da kullanılamaz. Bazel'in kendisi daha az temel aldığı için Bash'e (MSYS2) daha az ihtiyaç duyduğundan, gelecekte kullanıcıların MSYS2'ye sahip olma birlikte kurulur. Kuralların Windows'da kullanımını kolaylaştırmak için işlemlerdir.
Satır uzantıları: Windows CRLF (
\r\n
), Unix benzeri sistemlerde LF (\n
) kullanılı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, amaca yönelik 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. Hiçbiri Bash'e bağlı değil Windows'da oluşturulduğunda/test edildiğinde kullanılır.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()
. (kaynak, dokümanlar): iki dosyanın içeriğini karşılaştıran testnative_test()
. (kaynak, dokümanlar): bir*_test
kuralında yerel ikili programı sarmalar. Bunubazel test
Windows'da
.bat
komut dosyalarını önemsiz işlemler için 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ızDefaultInfo()
döndürürse sağlayıcısını seçersenizexecutable
alanı, Windows'da söz konusu.bat
dosyasına işaret edebilir.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ı bir
native.sh_binary()
veyanative.genrule()
. Bazel, Bash'in kullanılabilir olup olmadığını kontrol eder ve komut dosyasını veya Bash.Starlark deposu kurallarında Bash'ten tamamen kaçınmayı deneyin. Bazel şu anda reklam yayınlamak için Depo kurallarında ilkeli bir şekilde Bash komutları.
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, çalışan bir işlem dosyayı hâlâ saklıyor olabilir açın.
Çalışan bir işlemin çalışma dizini silinemez.
İşlemlerin çalışma dizinlerinin açık bir herkese açık kullanıcı adı vardır ve dizin silinemez süre sona erene kadar beklemeniz gerekebilir.
Çözümler:
Kodunuzda, dosyaları hızlı şekilde kapatmayı deneyin.
Java'da
try-with-resources
ifadesini kullanın. Python'dawith open(...) as f:
kullanın. Prensip olarak, mümkün olduğunca kısa sürede kapatmalısınız.