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 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") ve System.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ın executable 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 getirir

    • write_file() (kaynak, dokümanlar): isteğe bağlı olarak, istenen satır sonlarıyla (auto, unix veya windows) 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 veya run_binary() içinde kullanabilirsiniz. tool özelliği veya native.genrule() tools özelliği

    Test kuralı örnekleri:

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

    • native_test() (source, documentation): yerel bir ikili dosyayı *_test kuralına sarmalayarak bazel 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 bir DefaultInfo() sağlayıcı döndürüyorsa executable 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() veya native.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'da with open(...) as f: kullanın. Prensip olarak, mümkün olduğunca kısa sürede kapatmalısınız.