Windows'da Yazma Kuralları

Sorun bildir Kaynağı göster

Bu sayfa, Windows ile uyumlu kurallar yazmaya, taşınabilir kural yazmayla ilgili yaygın sorunlara ve bazı çözümlere odaklanmaktadır.

Yollar

Sorunlar:

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

    Windows da daha uzun yolları (32.767 karaktere kadar) desteklese de, birçok program alt sınırla oluşturulmuştur.

    İşlem sırasında çalıştırdığınız programlarla ilgili olarak bu konuya dikkat edin.

  • Çalışma dizini: Ayrıca 259 karakterle sınırlıdır.

    İşlemler, 259 karakterden uzun bir dizine cd 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, Unix tarzı yolları / ayırıcılarla depoluyor. Bazı Windows programları Unix tarzı yolları desteklese de diğerleri desteklemez. cmd.exe'deki bazı yerleşik komutlar bunları destekler, bazıları desteklemez.

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

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

    Windows'daki mutlak yollar bir sürücü harfiyle başlar (ör. C:\foo\bar.txt). Tek bir dosya sistemi kökü yoktur.

    Kuralınız bir yolun mutlak olup olmadığını kontrol ediyorsa bunu unutmayın. Çoğunlukla taşınabilir olmadıklarından mutlak yollardan kaçınılmalıdır.

Çözümler:

  • Yolları kısa tutun.

    Uzun dizin adlarından, derinlemesine iç içe yerleştirilmiş dizin yapılarından, uzun dosya adlarından, uzun çalışma alanı adlarından, uzun hedef adlarından kaçının.

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

  • Kısa çıktı kökü kullanın.

    Bazel çıktıları için kısa bir yol belirtmek üzere --output_user_root=<path> işaretini kullanın. Yalnızca Bazel çıkışları için (D:\`), and adding this line to your.bazelrc dosyası gibi) bir sürücüye (veya sanal sürücüye) sahip olmak 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 simgesel bağlantılarıdır. Kavşaklar kolayca oluşturulur ve uzun yolları olan dizinlere (aynı bilgisayarda) işaret edebilir. 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ı noktasının bulunduğu dizindeki dosyalara erişebilir.

    .bat dosyalarında veya cmd.exe'de şuna benzer bağlantı oluşturabilirsiniz:

    mklink /J c:\path\to\junction c:\path\to\very\long\target\path
    

    [1]: Daha net ifade etmek gerekirse Bağlantılar, Sembolik Bağlantılar değildir ancak derleme işlemleri amacıyla, Bağlantı Noktalarını Dizin Simgesel Bağlantıları olarak kabul edebilirsiniz.

  • İşlemler / ortamlardaki yollarda / değerini "" ile değiştirin.

    Bir işlem için komut satırı veya ortam değişkenleri oluştururken yolları Windows stilinde yapın. Ö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.)

  • Hermetiklik: İşlemler olabildiğince az sayıda ö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 sık sık değişen veya kullanıcılara özel olan ortam değişkenleri kullanıyorsa kuralın önbelleğe alınabilirliği daha düşük olur.

Çözümler:

  • Ortam değişkeni adlarını yalnızca büyük harfle yazı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. İşlem daha fazla ortam değişkeni gerektiriyorsa tümünü bir sözlüğe yerleştirin ve işleme aktarın. Ö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, ctx.actions.run executable olarak belirtemeyeceğinizi unutmayın. Ayrıca, dosyaların sahip olabileceği +x izni yoktur. Bu nedenle, Linux'ta olduğu gibi rastgele dosyaları yürütemezsiniz.

  • 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'da kullanılamaz. Bazel'in kendisi Bash'i (MSYS2) giderek daha az kullanmaktadır. Dolayısıyla, gelecekteki kullanıcıların Bazel ile birlikte MSYS2'yi de yükleme olasılığı düşer. Kuralların Windows'da kullanımını kolaylaştırmak için işlemlerde Bash komutlarını çalıştırmaktan kaçının.

  • Satır sonları: Windows'da CRLF (\r\n), Unix benzeri sistemler LF (\n) kullanır.

    Metin dosyalarını karşılaştırırken buna dikkat edin. Git ayarlarınıza, özellikle de ödeme veya taahhütte 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ı için sarmalayıcıdır ve genellikle dosya kopyalama veya metin dosyası yazma gibi basit sorunları çözmek için kullanılır. Bash'a güvenmekten (ve tekerleği yeniden icat etmekten) kaçınabilirsiniz: bazel-skylib'in ihtiyaçlarınız için amaca yönelik bir kuralı olup olmadığına bakın. Bunların hiçbiri Windows'da oluşturulduğunda/test edildiğinde Bah'a bağımlı 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): İstenen satır sonlarıyla (auto, unix veya windows) bir metin dosyası yazar ve isteğe bağlı olarak (komut dosyasıysa) yürütülebilir hale getirir

    • run_binary() (source, documentation): Derleme işlemi olarak verilen girişler ve beklenen çıkışlarla 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): yerel ikili programı *_binary kuralında sarmalar. bazel run veya run_binary() öğesinintool özelliğinde veya native.genrule()'ın tools özelliğinde kullanabilirsiniz.

    Test kuralı örnekleri:

    • diff_test() (kaynak, dokümanlar): İki dosyanın içeriğini karşılaştıran test

    • native_test() (kaynak, dokümanlar): yerel ikili programı *_test kuralında sarmalar. Bu şekilde bazel test

  • Windows'da .bat komut dosyalarını basit işlemler için kullanmayı düşünün.

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

    Örneğin, hiçbir şey yapmayan, 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ısı döndürürse executable alanı, Windows'daki bu .bat dosyasına başvuruda bulunabilir.

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

    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.

  • Bahsh'ı 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ını 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. Şu anda Bazel, depo kurallarında Baz komutlarını ilkeli bir şekilde çalıştırmak için hiçbir yol sunmamaktadır.

Dosyalar siliniyor

Sorunlar:

  • Dosyalar açıkken silinemez.

    Açık dosyalar silinemez (varsayılan olarak). Denemeler, "Erişim Reddedildi" hatalarına neden olur. Bir dosyayı silemiyorsanız, çalışan bir işlem dosyayı hâlâ açık tutuyor olabilir.

  • Çalışan bir işlemin çalışma dizini silinemez.

    İşlemlerin çalışma dizinlerinde açık bir herkese açık kullanıcı adı bulunur ve dizin, işlem sona erene kadar silinemez.

Çözümler:

  • Kodunuzda dosyaları dikkatlice kapatmaya çalışın.

    Java'da try-with-resources kullanın. Python'da with open(...) as f: kullanın. Prensip olarak, herkese açık kullanıcı adlarını en kısa sürede kapatmayı deneyin.