Windows'da Yazma Kuralları

Sorun bildirin Kaynağı göster Gece · 7,4 , 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ı (32.767 karaktere kadar) da desteklese de birçok program daha düşük sınırla oluşturulur.

    İşlemlerde çalıştırdığınız programlarla ilgili bu hususa dikkat edin.

  • Ç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ılarla Unix tarzında 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.

    İş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ş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ı, derin iç içe yerleştirilmiş dizin yapıları, uzun dosya adları, uzun çalışma alanı adları, uzun hedef adları kullanmaktan kaçının.

    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. 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
    
  • Bağlantı noktalarını 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 birleştirme noktaları 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: İş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ş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 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. İş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 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'in kendisi daha az temel aldığı ortaya çıktığından, ileride kullanıcıların MSYS2'ye sahip olma olasılığı daha düşük olacaktır. birlikte kurulur. Windows'da kuralların kullanımını kolaylaştırmak için işlemlerde Bash komutları çalıştırmaktan kaçının.

  • Satır uzantıları: Windows CRLF (\r\n), Unix benzeri sistemlerde LF (\n) kullanılır.

    Metin dosyalarını karşılaştırırken bu noktayı 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. 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'ta derlenirken/test edilirken Bash'e bağlı değildir.

    Derleme kuralı örnekleri:

    • 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, documentation): İstenen satır sonlarını (auto, unix veya windows) içeren bir metin dosyası yazar ve isteğe bağlı olarak (komut dosyasıysa) dosyayı yürütülebilir hale getirir

    • run_binary() (source, documentation): belirli girişler ve beklenen çıkışlarla bir ikili dosyayı (veya *_binary kuralını) derleme işlemi olarak çalıştırır (bu, ctx.actions.run için bir derleme kuralı sarmalayıcısı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. Bu işlemi 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, mesaj yazdıran veya sabit bir hata koduyla çıkan bir komut dosyasına ihtiyacınız varsa basit bir .bat dosyası yeterlidir. 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 içine bir boşluk yazın.

  • Bash'i prensipli bir ş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() içine alı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çının. Bazel şu anda depo kurallarında Bash komutlarını prensipli bir şekilde çalıştırmanın bir yolunu sunmuyor.

Dosyalar siliniyor

Sorunlar:

  • Açıkken dosyalar silinemez.

    Açık dosyalar (varsayılan olarak) silinemez. Silme denemeleri "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 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 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.