Baklavalar

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

Bir komut satırının bir kısmını veya tamamını oluşturmak için gereken verileri bellek açısından verimli bir şekilde kapsayan bir nesne.

Bir işlem için genellikle geçişli bağımlılıklardan toplanan değerleri içeren büyük bir komut satırı gerekir. Örneğin, bir bağlayıcı komut satırı, bağlanan tüm kitaplıkların ihtiyaç duyduğu her nesne dosyasını listeleyebilir. Bu tür geçişli verileri birden fazla hedef tarafından paylaşılabilmesi için depset'lerde depolamak en iyi uygulamadır. Ancak, kural yazarının bir işlem komut satırı oluşturmak için bu ayrıntılı bölümleri dize listelerine dönüştürmesi gerektiyse bu, bellek paylaşımı optimizasyonunu geçersiz kılar.

Bu nedenle, işlem oluşturan işlevler dizelere ek olarak Args nesnelerini de kabul eder. Her Args nesnesi, verileri değiştirmek için isteğe bağlı dönüşümler içeren dize ve depset dizilişi temsil eder. Args nesneleri, komut satırının hesaplanması gerektiğinde yürütme aşamasına kadar kapsadıkları depset'leri işlemez. Bu sayede, pahalı kopyalama işlemleri analiz aşaması tamamlanana kadar ertelenebilir. Daha fazla bilgi için Performansı Optimize Etme sayfasına bakabilirsiniz.

Args, ctx.actions.args() çağrılarak oluşturulur. Bunlar, ctx.actions.run() veya ctx.actions.run_shell() için arguments parametresi olarak iletilebilir. Bir Args nesnesinin her mutasyonu, nihai komut satırına değerler ekler.

map_each özelliği, öğelerin dizelere nasıl dönüştürüleceğini özelleştirmenizi sağlar. map_each işlevi sağlamazsanız standart dönüşüm aşağıdaki gibi olur:

  • Zaten dize olan değerler olduğu gibi bırakılır.
  • File nesneleri, File.path değerlerine dönüştürülür.
  • Label nesneleri, ana depo bağlamında çözüldüğünde aynı nesneye geri dönen bir dize temsiline dönüştürülür. Mümkünse dize temsilinde, deposunun kanon adı yerine deposunun görünen adı kullanılır. Bu, söz konusu temsilin BUILD dosyalarında kullanılmasına olanak tanır. Temsil biçiminin tam olarak ne olacağı garanti edilmez. Bununla birlikte, //foo:bar, @repo//foo:bar ve @@canonical_name+//foo:bar.bzl tipik örneklerdir.
  • Diğer tüm türler belirtilmemiş bir şekilde dizelere dönüştürülür. Bu nedenle, add() öğesine dize veya File türü olmayan değerleri iletmekten kaçınmanız gerekir. Bunları add_all() veya add_joined()’e iletirseniz bir map_each işlevi sağlamanız gerekir.

Dize biçimlendirmesi (add*() yöntemlerinin format, format_each ve format_joined parametreleri) kullanıldığında, biçim şablonu dizelerdeki % yerine koyma işleviyle aynı şekilde yorumlanır. Tek fark, şablonun tam olarak bir yer tutucu içermesi ve bu yer tutucunun %s olmasıdır. Değişmez yüzdeler %% olarak kaçış karakteri ile kullanılabilir. Biçimlendirme, değer yukarıda belirtildiği gibi bir dizeye dönüştürüldükten sonra uygulanır.

add*() yöntemlerinin her birinin, ekstra konum parametresini ve bağımsız değişkenlerin geri kalanından önce eklenecek "bağımsız değişken adı" dizesini kabul eden alternatif bir biçimi vardır. add_all ve add_joined için, dizi boşsa ek dize eklenmez. Örneğin, aynı kullanım, belirtilen adım sırasının val1..val3 içerip içermediğine veya boş olmasına bağlı olarak komut satırına --foo val1 val2 val3 --bar veya yalnızca --bar eklenebilir.

Komut satırının boyutu, sistem tarafından izin verilen maksimum boyuttan daha uzun olabilir. Bu durumda bağımsız değişkenler parametre dosyalarına aktarılabilir. use_param_file() ve set_param_file_format() başlıklı makaleleri inceleyin.

Örnek: Şu komut satırını oluşturmak istediğimizi varsayalım:

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
Aşağıdaki Args nesnesini kullanabiliriz:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

Üyeler

add

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

Bu komut satırına bir bağımsız değişken ekler.

Parametreler

Parametre Açıklama
arg_name_or_value required
İki konumsal parametre iletilirse bu, arg adı olarak yorumlanır. Arg adı, herhangi bir işlem yapılmadan değerden önce eklenir. Yalnızca bir konumsal parametre iletilirse bu parametre value olarak yorumlanır (aşağıya bakın).
value varsayılan unbound şeklindedir
Eklenecek nesne. Yukarıda belirtilen standart dönüşüm kullanılarak bir dizeye dönüştürülür. Bu işlev için map_each parametresi olmadığından value bir dize veya File olmalıdır. Bu yöntem yerine add_all() veya add_joined()'e bir liste, tuple, depset veya dizin File gönderilmelidir.
format dize veya None; varsayılan değer None
value değerinin dize haline getirilmiş sürümüne uygulanacak bir biçim dizesi kalıbı.

add_all

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

Bu komut satırına birden çok bağımsız değişken ekler. Öğeler, yürütme aşamasında yavaşça işlenir.

İşlemin büyük kısmı, aşağıdaki adımlara göre eklenecek bir bağımsız değişkenler listesi üzerinden gerçekleştirilir:

  1. Her dizin File öğesi, söz konusu dizinde yinelenen şekilde bulunan tüm File öğeleriyle değiştirilir.
  2. map_each sağlanırsa her öğeye uygulanır ve elde edilen dize listeleri, ilk bağımsız değişken listesini oluşturmak için birleştirilir. Aksi takdirde, ilk bağımsız değişken listesi, standart dönüşümün her öğeye uygulanmasının sonucudur.
  3. Varsa listedeki her bağımsız değişken format_each ile biçimlendirilir.
  4. uniquify doğruysa yinelenen bağımsız değişkenler kaldırılır. İlk gerçekleşme, kalandır.
  5. Bir before_each dizesi sağlanırsa listedeki her mevcut bağımsız değişkenden önce yeni bir bağımsız değişken olarak eklenir. Bu, bu noktaya kadar eklenecek bağımsız değişken sayısını etkili bir şekilde ikiye katlar.
  6. Listenin boş olması ve omit_if_empty değerinin true (varsayılan) olması dışında, arg adı ve terminate_with (varsa) sırasıyla ilk ve son bağımsız değişken olarak eklenir.
Boş dizelerin, tüm bu işleme adımlarına tabi olan geçerli bağımsız değişkenler olduğunu unutmayın.

Parametreler

Parametre Açıklama
arg_name_or_values required
İki konumsal parametre iletilirse bu, arg adı olarak yorumlanır. Arg adı, herhangi bir işlem yapılmadan ayrı bir bağımsız değişken olarak values öğesinden önce eklenir. omit_if_empty doğruysa (varsayılan) ve başka öğe eklenmezse (values boşsa veya tüm öğeleri filtrelenirse olduğu gibi) bu bağımsız değişken adı eklenmez. Yalnızca bir konumsal parametre iletilirse bu parametre values olarak yorumlanır (aşağıya bakın).
values sequence veya depset; varsayılan değer unbound
Öğelerinin ekleneceği liste, tuple veya depset.
map_each çağrılabilir; veya None; varsayılan değer None
Her öğeyi sıfır veya daha fazla dizeye dönüştüren bir işlevdir. Bu işlev, eklenmeden önce daha fazla işlenebilir. Bu parametre sağlanmazsa standart dönüşüm kullanılır.

İşleve bir veya iki konum bağımsız değişkeni iletilir: dönüştürülecek öğe ve ardından isteğe bağlı DirectoryExpander. İkinci bağımsız değişken yalnızca sağlanan işlev kullanıcı tanımlıysa (yerleşik değilse) ve birden fazla parametre tanımlamışsa iletilir.

Döndürülen değerin türü, öğe için kaç bağımsız değişkenin oluşturulacağına bağlıdır:

  • Her bir öğenin bir dizeye dönüştüğü yaygın durumda, işlev bu dizeyi döndürmelidir.
  • Öğenin tamamen filtrelenmesi gerekiyorsa işlev None değerini döndürmelidir.
  • Öğe birden fazla dizeye dönüşürse işlev bu dizelerin listesini döndürür.
Tek bir dize veya None döndürmek, sırasıyla 1 veya 0 uzunluğunda bir liste döndürmekle aynı etkiye sahiptir. Ancak, gerekmediği durumlarda liste oluşturmaktan kaçınmak daha verimli ve okunaklı bir yöntemdir.

Normalde, expand_directories=True ayarlandığında dizin olan öğeler otomatik olarak içeriklerini içerecek şekilde genişletilir. Ancak bu işlem, diğer değerlerin içinde bulunan dizinleri genişletmez. Örneğin, öğeler alan olarak dizin içeren yapılardır. Bu durumda, belirli bir dizindeki dosyaları manuel olarak almak için DirectoryExpander bağımsız değişkeni uygulanabilir.

Büyük analiz aşaması veri yapılarının, yürütme aşamasında istenmeyen şekilde saklanmasını önlemek için map_each işlevi, üst düzey bir def ifadesiyle bildirilmelidir. Bu, varsayılan olarak iç içe yerleştirilmiş bir işlev kapanışı olmayabilir.

Uyarı: map_each çağrısı sırasında yürütülen print() ifadeleri görünür bir çıkış oluşturmaz.

format_each dize; veya None; varsayılan olarak None
İsteğe bağlı bir biçim dizesi kalıbı. map_each işlevi tarafından döndürülen her dizeye uygulanır. Biçim dizesinde tam olarak bir tane "%s" yer tutucu olmalıdır.
before_each dize; veya None; varsayılan değer None
values kaynağından türetilen her bağımsız değişken eklenmeden önce eklenecek isteğe bağlı bir bağımsız değişken.
omit_if_empty bool; varsayılan değer True
Doğru ise, values alanından türetilecek bağımsız değişken yoksa diğer tüm işlemler atlanır ve komut satırında değişiklik olmaz. Yanlış ise başka bağımsız değişken olup olmadığına bakılmaksızın bağımsız değişken adı ve terminate_with (varsa) eklenir.
uniquify bool; varsayılan değer False
Doğru ise values öğesinden türetilen yinelenen bağımsız değişkenler atlanır. Her bağımsız değişkenin yalnızca ilk örneği kalır. Etiketler zaten yinelenen öğeleri atladığı için bu özellik genellikle gerekli değildir ancak map_each, birden fazla öğe için aynı dizeyi yayınlarsa yararlı olabilir.
expand_directories bool; varsayılan değer True
Değer true ise values içindeki tüm dizinler düz bir dosya listesine genişletilir. Bu işlem, map_each uygulanmadan önce gerçekleşir.
terminate_with dize; veya None; varsayılan değer None
Diğer tüm bağımsız değişkenlerden sonra eklenecek isteğe bağlı bir bağımsız değişken. omit_if_empty doğruysa (varsayılan) ve başka öğe eklenmezse (values boşsa veya tüm öğeleri filtrelenirse olduğu gibi) bu bağımsız değişken eklenmez.
allow_closure bool; varsayılan değer False
Doğru ise map_each gibi işlev parametrelerinde kapatma ifadelerinin kullanılmasına izin verir. Bu genellikle gerekli değildir ve analiz aşamasındaki büyük veri yapılarının yürütme aşamasında tutulması riskini taşır.

add_joined

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

Ayırıcı kullanarak birden fazla değeri birleştirerek bu komut satırına bir bağımsız değişken ekler. Öğeler, yürütme aşamasında yavaşça işlenir.

İşleme, add_all() işlevine benzer ancak values bağımsız değişkeninden türetilen bağımsız değişken listesi, join_with.join(...) işlevi gibi tek bir bağımsız değişkende birleştirilir ve ardından belirtilen format_joined dize şablonu kullanılarak biçimlendirilir. Öğeler tek bir bağımsız değişkende birleştirildiğinde genellikle yararlı olmadıkları için add_all()'ten farklı olarak before_each veya terminate_with parametresi yoktur.

Filtreleme işleminden sonra bir bağımsız değişkene birleştirilecek dize yoksa ve omit_if_empty doğruysa (varsayılan) herhangi bir işlem yapılmaz. Aksi takdirde, birleştirilecek dize yoksa ancak omit_if_empty yanlışsa birleştirilen dize boş bir dize olur.

Parametreler

Parametre Açıklama
arg_name_or_values required
İki konumsal parametre iletilirse bu, arg adı olarak yorumlanır. Arg adı, herhangi bir işlem yapılmadan values öğesinden önce eklenir. omit_if_empty doğruysa (varsayılan) ve values'ten birleştirilecek dize yoksa (values boşsa veya tüm öğeleri filtrelenmişse bu durum oluşabilir) bu bağımsız değişken eklenmez. Yalnızca bir konum parametresi iletilirse values olarak yorumlanır (aşağıya bakın).
values sequence; veya depset; varsayılan olarak unbound şeklindedir
Öğeleri birleştirilecek liste, unsur veya depset.
join_with string; zorunlu
map_each ve format_each uygulandığında elde edilen dizeleri string.join() ile aynı şekilde birleştirmek için kullanılan bir ayırıcı dize.
map_each çağrılabilir; veya None; varsayılan değer None
add_all ile aynıdır.
format_each dize veya None; varsayılan değer None
add_all ile aynıdır.
format_joined dize; veya None; varsayılan değer None
Birleştirilen dizeye uygulanan isteğe bağlı bir biçim dizesi kalıbı. Biçim dizesinde tam olarak bir tane "%s" yer tutucu olmalıdır.
omit_if_empty bool; varsayılan değer True
Doğruysa ve birleştirilecek dize yoksa (values boş olduğu veya tüm öğeleri filtrelendiği için) diğer tüm işlemler atlanır ve komut satırı değişmez. Yanlış değeri döndürülürse birleştirilecek dize olmasa bile iki bağımsız değişken eklenir: bağımsız değişken adı ve ardından boş bir dize (sıfır dizelerin mantıksal birleştirmesi).
uniquify bool; varsayılan değer False
add_all ile aynıdır.
expand_directories bool; varsayılan değer True
add_all ile aynıdır.
allow_closure bool; varsayılan değer False
add_all ile aynıdır.

set_param_file_format

Args Args.set_param_file_format(format)

Kullanılıyorsa parametre dosyasının biçimini ayarlar

Parametreler

Parametre Açıklama
format string; zorunlu
Şu değerlerden biri olmalıdır:
  • "multiline": Her öğe (bağımsız değişken adı veya değeri), param dosyasına aynen yazılır ve ardından yeni satır karakteri eklenir.
  • "shell": "multiline" ile aynıdır ancak öğeler kabuk tırnak içine alınır
  • "flag_per_line": "multiline" ile aynıdır ancak (1) parametre dosyasına yalnızca işaretler ("--" ile başlayan) yazılır ve (2) varsa işaretlerin değerleri aynı satıra "=" ayırıcıyla yazılır. Abseil bayrakları kitaplığı tarafından beklenen biçim budur.

Çağrılanmazsa biçim varsayılan olarak "shell" olur.

use_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

Arg'leri bir params dosyasına aktarır ve bunları param dosyasına işaret eden bir işaretçiyle değiştirir. Bağımsız değişkenleriniz, sistemin komut uzunluğu sınırları için çok büyük olduğunda kullanın.

Bazel, verimlilik için yürütme sırasında params dosyasının çıkış ağacına yazılmasını atlayabilir. İşlemlerde hata ayıklama yapıyorsanız ve parametre dosyasını incelemek istiyorsanız derlemenize --materialize_param_files parametresini iletin.

Parametreler

Parametre Açıklama
param_file_arg dize; zorunlu
Tek bir "%s" içeren bir biçim dizesi. args bir params dosyasına dökülürse params dosyasının yoluyla biçimlendirilmiş bu dizeden oluşan bir bağımsız değişkenle değiştirilir.

Örneğin, bağımsız değişkenler "params.txt" params dosyasına döküldüyse, "--file=%s" değerinin belirtilmesi işlem komut satırında "--file=params.txt" ifadesini içermesine neden olur.

use_always bool; varsayılan değer False
Parametrelerin her zaman bir parametreler dosyasına aktarılıp aktarılmayacağını belirtir. Yanlış değerine ayarlanırsa bazel, sisteminize ve bağımsız değişken uzunluğuna göre bağımsız değişkenlerin dökülmesi gerekip gerekmediğine karar verir.