Windows'da Yazma Kuralları

Sorun bildir Kaynağı görüntüleyin Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bu sayfada Windows ile uyumlu kurallar yazmaya, taşınabilir kural yazmayla ilgili sık karşılaşılan sorunlara ve bazı çözümlere odaklanılmaktadır.

Yollar

Sorunlar:

  • Uzunluk sınırı: Maksimum yol uzunluğu 259 karakterdir.

    Windows daha uzun yolları (32.767 karaktere kadar) da desteklese de birçok program daha düşük sınırla oluşturulur.

    İşlemlerde çalıştırdığınız programlar için bunu göz önünde bulundurun.

  • Çalışma dizini: 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ı 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ı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 stili yolları desteklerken bazıları desteklemez. cmd.exe'deki bazı yerleşik komutlar bunları destekler, bazıları desteklemez.

    İşlemler için komut satırı ve ortam değişkenleri oluştururken her zaman \` separators on Windows: replace/with` kullanmanızı öneririz.

  • Mutlak yollar: Eğik çizgiyle (/) başlamayın.

    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 bu durumu 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ı adları, uzun hedef adları kullanmaktan kaçının.

    Bunların tümü, işlemlerin giriş dosyalarının yol bileşenleri haline gelebilir ve yol uzunluğu sınırını aşabilir.

  • 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. Yalnızca Bazel çıkışları (ör. D:\`), and adding this line to your.bazelrc` dosyası) için bir sürücü (veya sanal sürücü) kullanmak iyi bir fikirdir:

    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 yolları olan dizinleri (aynı bilgisayarda) gösterebilir. Bir derleme işlemi, yolu kısa ancak hedefi uzun olan bir bağlantı oluşturursa kısa yol sınırına sahip araçlar, bağlantı verilen 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 / envvars'daki yollarda / yerine " işareti koyun.

    Bir işlem için komut satırını veya ortam değişkenlerini oluştururken yolları Windows tarzında oluşturun. Ö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") ve System.getenv("SYSTEMROOT") aynı sonucu verir. (Bu durum diğer diller için de geçerlidir.)

  • Hermeticity: İş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şlemde sık sık değişen veya kullanıcılara özel olan ortam değişkenleri kullanılıyorsa 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 kullanılabilir.

  • İş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: Her yürütülebilir dosyanın yürütülebilir 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 EXE dosyası OLMADIĞINI unutmayın. Bu dosyaları ctx.actions.run'un executable olarak belirtemezsiniz. 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 açısından, 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 LF (\n) kullanır.

    Metin dosyalarını karşılaştırırken bu noktayı göz önünde bulundurun. Git ayarlarınıza, özellikle de kodları kontrol ederken veya kodları gönderirken satır sonlarına dikkat edin. (Git'in core.autocrlf ayarına bakın.)

Çözümler:

  • BAsh içermeyen, amaca yönelik bir kural kullanın.

    native.genrule(), Bash komutlarına yönelik bir sarmalayıcıdır ve genellikle dosya kopyalama veya metin dosyası yazma gibi basit sorunları çözmek için kullanılır. Bash'e güvenmekten (ve tekerleği yeniden icat etmekten) kaçınabilirsiniz: bazel-skylib'de ihtiyaçlarınıza yönelik özel bir kural olup olmadığına bakın. Bunların hiçbiri Windows'da derlendiğinde/test edildiğinde Bash'e bağlı değildir.

    Kural örnekleri oluşturma:

    • copy_file() (kaynak, belgelendirme): Bir dosyayı başka bir yere kopyalar ve isteğe bağlı olarak yürütülebilir hale getirir

    • write_file() (source, dokümanlar): İstenen satır sonlarıyla (auto, unix veya windows) bir metin dosyası yazar ve isteğe bağlı olarak dosyayı yürütülebilir hale getirir (komut dosyasıysa)

    • run_binary() (source, documentation): belirli girişler ve beklenen çıkışlarla bir derleme işlemi olarak ikili dosyayı (veya *_binary kuralını) çalıştırır (bu, ctx.actions.run için bir derleme kuralı sarmalayıcısıdır)

    • native_binary() (kaynak, dokümanlar): Doğal bir ikili dosyayı *_binary kuralına sarmalayarak bazel run olarak kullanabilir veya run_binary()'ın tool özelliğinde ya da native.genrule()'ın tools özelliğinde kullanabilirsiniz

    Test kuralı örnekleri:

    • diff_test() (source, documentation): iki dosyanın içeriğini karşılaştıran test

    • native_test() (source, dokümanlar): *_test kuralına yerel ikili programı sarmalar. Bu ikili programı bazel test

  • Windows'ta, önemsiz işlemler için .bat komut dosyalarını kullanabilirsiniz.

    .sh komut dosyaları yerine .bat komut dosyalarıyla basit görevleri çözebilirsiniz.

    Örneğin, hiçbir şey yapmayan, bir mesajı yazdıran veya sabit bir hata koduyla çıkış yapan bir komut dosyasına ihtiyacınız varsa basit bir .bat dosyası yeterli olacaktır. Kuralınız bir DefaultInfo() sağlayıcı döndürüyorsa executable alanı Windows'daki .bat dosyasını referans alabilir.

    Ayrıca, macOS ve Linux'ta dosya uzantıları önemli olmadığından, kabuk komut dosyaları için bile uzantı olarak her zaman .bat kullanabilirsiniz.

    Boş .bat dosyalarının yürütülemeyeceğini unutmayın. Boş bir komut dosyasına ihtiyacınız varsa içine bir boşluk yazın.

  • Bash'i prensiplere uygun şekilde kullanın.

    Starlark derleme ve test kurallarında, Bash komut dosyalarını ve Bash komutlarını işlem olarak çalıştırmak için ctx.actions.run_shell kullanın.

    Starlark makrolarında, Bash komut dosyalarını ve komutları native.sh_binary() veya native.genrule() ile sarmalayın. Bazel, Bash'in kullanılabilir olup olmadığını kontrol eder ve komut dosyasını veya komutu Bash üzerinden çalıştırır.

    Starlark deposu kurallarında Bash'ten tamamen kaçınmayı deneyin. 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" hatalarıyla sonuçlanır. Bir dosyayı silemiyorsanız dosyayı açık tutan çalışan bir işlem olabilir.

  • Çalışan bir işlemin ç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'da with open(...) as f: kullanın. Herkese açık kullanıcı adlarını mümkün olduğunca hızlı bir şekilde kapatmaya çalışın.