Windows'da Yazma Kuralları

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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") ve System.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ın executable 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 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(). (kaynak, dokümanlar): iki dosyanın içeriğini karşılaştıran test

    • native_test(). (kaynak, dokümanlar): bir *_test kuralında yerel ikili programı sarmalar. Bunu bazel 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ız DefaultInfo() döndürürse sağlayıcısını seçerseniz executable 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() veya native.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'da with open(...) as f: kullanın. Prensip olarak, mümkün olduğunca kısa sürede kapatmalısınız.