Ana içeriğe geç

`deno task`

Açıklama

deno task, bir kod tabanı için özel komutları tanımlamak ve çalıştırmak için çok platformlu bir yol sağlar.

Başlamak için, komutlarınızı kod tabanınızın Deno yapılandırma dosyasında "tasks" anahtarı altında tanımlayın.

ipucu

Başlangıçta kullanılan yapılandırma ile komutlarınızı etkili bir şekilde yönetin.

Örneğin:

{
"tasks": {
"data": "deno task collect && deno task analyze",
"collect": "deno run --allow-read=. --allow-write=. scripts/collect.js",
"analyze": {
"description": "Analiz betiğini çalıştır",
"command": "deno run --allow-read=. scripts/analyze.js"
}
}
}

Geçerli çalışma dizinini belirtme

Varsayılan olarak, deno task, Deno yapılandırma dosyasının dizinini (ör. deno.json) geçerli çalışma dizini olarak kullanır. Bu, görevlerin göreli yolları kullanmasını ve deno görevini nerede çalıştırırsanız çalışmaya devam etmesini sağlar. Bazı senaryolarda, bu istenmeyebilir ve bu davranış INIT_CWD ortam değişkeni ile geçersiz kılınabilir.

bilgi

INIT_CWD, görev çalıştırıldığında dizininin tam yolu ile ayarlanacak, eğer daha önce ayarlanmamışsa.

Bu, npm run ile aynı davranışla uyumludur.

Örneğin, aşağıdaki görev, görev kullanıcı tarafından çalıştırılan dizinde geçerli çalışma dizinini değiştirecek ve ardından artık o dizinde olan geçerli çalışma dizinini çıktılayacaktır (unutmayın, bu Windows'da da çalışır çünkü deno task çok platformludur).

{
"tasks": {
"my_task": "cd $INIT_CWD && pwd"
}
}

deno task'in çalıştırıldığı dizini alma

Görevler, geçerli çalışma dizini olarak Deno yapılandırma dosyasının dizinini kullanarak çalıştırıldığı için, deno task'in hangi dizinden çalıştırıldığını bilmek faydalı olabilir. Bu, deno task'ten başlatılan bir görev veya betikte INIT_CWD ortam değişkenini kullanarak mümkündür (aynı şekilde çalışır npm run, ama çok platformlu bir şekilde).

not

Bu bilgiyi kullanarak geliştirme süreçlerinizi optimize edebilirsiniz.

Örneğin, bu dizini bir betiğe sağlamak için bir görevde şu şekilde yapabilirsiniz (dizinin boşluk içerme ihtimaline karşı, tek bir argüman olarak kalması için çift tırnak içinde çevrelenmiştir):

{
"tasks": {
"start": "deno run main.ts \"$INIT_CWD\""
}
}

Görev bağımlılıkları

Bir göreve bağımlılıkları belirtebilirsiniz:

deno.json
{
"tasks": {
"build": "deno run -RW build.ts",
"generate": "deno run -RW generate.ts",
"serve": {
"command": "deno run -RN server.ts",
"dependencies": ["build", "generate"]
}
}
}

Yukarıdaki örnekte, deno task serve çalıştırıldığında, önce build ve generate görevlerini paralel olarak çalıştıracak ve her ikisi de başarıyla tamamlandığında serve görevi çalıştırılacaktır:

$ deno task serve
Görev build deno run -RW build.ts
Görev generate deno run -RW generate.ts
Veri üretiliyor...
Yapı başlatılıyor...
Yapı tamamlandı
Veri üretildi
Görev serve deno run -RN server.ts
http://localhost:8000/ adresinde dinleniyor...

Bağımlılık görevleri paraleldir ve varsayılan paralel limitiniz, makinenizdeki çekirdek sayısına eşittir. Bu limiti değiştirmek için DENO_JOBS ortam değişkenini kullanabilirsiniz.

Bağımlılıklar takip edilir ve birden fazla görev aynı görevi gerektiriyorsa, o görev yalnızca bir kez çalıştırılır:

deno.json
{
// a
// / \
// b c
// \ /
// d
"tasks": {
"a": {
"command": "deno run a.js",
"dependencies": ["b", "c"]
},
"b": {
"command": "deno run b.js",
"dependencies": ["d"]
},
"c": {
"command": "deno run c.js",
"dependencies": ["d"]
},
"d": "deno run d.js"
}
}
$ deno task a
Görev d deno run d.js
d çalıştırılıyor
Görev c deno run c.js
c çalıştırılıyor
Görev b deno run b.js
b çalıştırılıyor
Görev a deno run a.js
a çalıştırılıyor

Eğer bağımlılıklar arasında bir döngü keşfedilirse, bir hata dönecektir:

deno.json
{
"tasks": {
"a": {
"command": "deno run a.js",
"dependencies": ["b"]
},
"b": {
"command": "deno run b.js",
"dependencies": ["a"]
}
}
}
$ deno task a
Görev döngüsü tespit edildi: a -> b -> a

Çalışma alanı desteği

deno task, çoklu üye dizinlerinden görevleri paralel olarak çalıştırmak için çalışma alanlarında kullanılabilir. Tüm çalışma alanı üyelerinden dev görevlerini çalıştırmak için --recursive bayrağını kullanın:

deno.json
{
"workspace": [
"client",
"server"
]
}
client/deno.json
{
"tasks": {
"dev": "deno run -RN build.ts"
}
}
server/deno.json
{
"tasks": {
"dev": "deno run -RN server.ts"
}
}
$ deno task --recursive dev
Görev dev deno run -RN build.ts
Görev dev deno run -RN server.ts
Projeyi paketliyoruz...
http://localhost:8000/ adresinde dinleniyor...
Proje paketlendi

Çalıştırılacak görevler, çalışma alanı üyelerine göre filtrelenebilir:

$ deno task --filter "client/*" dev
Görev dev deno run -RN build.ts
Projeyi paketliyoruz...
Proje paketlendi

Söz Dizimi

deno task, tanımlanan görevleri çalıştırmak için sh/bash'ın bir alt kümesi olan çok platformlu bir shell kullanır.

Boolean listeleri

Boolean listeleri, ilk komutun çıkış koduna dayalı olarak ek komutlar çalıştırmak için bir yol sağlar. Komutları && ve || operatörleri ile ayırır.

not

Boolean listelerinde kullanılan operatörlerin doğru şekilde sıralanması, komutların doğru çıktılar almasını sağlar.

&& operatörü, bir komutu çalıştırma ve eğer başarılıysa (çıkış kodu 0 ise) bir sonraki komutu çalıştırma yolunu sağlar:

deno run --allow-read=. --allow-write=. collect.ts && deno run --allow-read=. analyze.ts

|| operatörü bunun tersidir. Bir komutu çalıştırma ve yalnızca başarısızsa (sıfırdan farklı bir çıkış kodu varsa) bir sonraki komutu çalıştırma yolunu sağlar:

deno run --allow-read=. --allow-write=. collect.ts || deno run play_sad_music.ts

Sıralı listeler

Sıralı listeler, boolean listelerine benzer, ancak listedeki bir önceki komutun başarılı olup olmadığına bakılmaksızın çalıştırılır. Komutlar bir nokta ve virgül (;) ile ayrılır.

deno run output_data.ts ; deno run --allow-net server.ts

Asenkron komutlar

Asenkron komutlar, bir komutun asenkron olarak çalıştırılmasını sağlamak için bir yol sunar. Bu, birden fazla işlemi başlatırken faydalı olabilir. Bir komutu asenkron hale getirmek için, sonuna & ekleyin. Örneğin aşağıdaki, sleep 1 && deno run --allow-net client.ts ve deno run --allow-net server.ts'yi aynı anda çalıştırır:

sleep 1 && deno run --allow-net client.ts & deno run --allow-net server.ts

Çoğu shell'de olduğu gibi, ilk asenkron komut başarısız olursa diğer tüm komutlar hemen başarısız olacaktır. Yukarıdaki örnekte, bu, eğer client komutu başarısız olursa, server komutunun da başarısız olacağı ve çıkacağı anlamına gelir. Bu davranıştan vazgeçmek için bir komutun sonuna || true ekleyebilirsiniz, bu da 0 çıkış kodunu zorlayacaktır. Örneğin:

deno run --allow-net client.ts || true & deno run --allow-net server.ts || true

Ortam değişkenleri

Ortam değişkenleri aşağıdaki gibi tanımlanır:

export VAR_NAME=value

Bir görevin içinde birini shell değişkeni yerine kullanmanın ve sonra Deno işleminin ortamının bir parçası olarak dışa aktarılmasının bir örneği (not: JSON yapılandırma dosyasında çift tırnakların ters eğik çizgilerle kaçırılması gerekir):

export VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

Aşağıdaki çıktıyı verecektir:

hello
Deno: hello

Bir komut için ortam değişkenlerini ayarlama

Bir komuttan önce ortam değişken(leri) belirtmek için şu şekilde sıralayın:

VAR=hello VAR2=bye deno run main.ts

Bu, bu ortam değişkenlerini sadece sonraki komut için kullanacaktır.

Shell değişkenleri

Shell değişkenleri, ortam değişkenlerine benzer, ancak oluşturulan komutlara dışa aktarılmazlar. Aşağıdaki sözdizimi ile tanımlanırlar:

VAR_NAME=value

Eğer bir shell değişkeni, ortam değişkeni yerine önceki "Ortam değişkenleri" kısmında gösterilen benzer bir örnekte kullanılırsa:

VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

Aşağıdaki çıktıyı alırız:

hello
Deno: undefined

Shell değişkenleri, bir değeri yeniden kullanmak istediğimizde faydalıdır, ancak bu değerin herhangi bir oluşturulan işlemlerde kullanılmasını istemeyiz.

Çıkış durumu değişkeni

Önceki çalıştırılan komutun çıkış kodu $? değişkeninde mevcuttur.

# 10 döndürür
deno eval 'Deno.exit(10)' || echo $?

Boru hatları

Boru hatları, bir komutun çıktılarını başka bir komuta yönlendirmek için bir yol sağlar.

Aşağıdaki komut, stdout çıktısını "Hello" olarak alır ve onu oluşturulan Deno işleminin stdin'ine yönlendirir:

echo Hello | deno run main.ts

stdout ve stderr yönlendirmek için, bunun yerine |& kullanın:

deno eval 'console.log(1); console.error(2);' |& deno run main.ts

Komut ikamesi

$(command) sözdizimi, bir komutun çıktısını başka yürütülen komutlarda kullanma yolu sağlar.

Örneğin, en son git revizyonunu almanın çıktısını başka bir komuta sağlamak için şunu yapabilirsiniz:

deno run main.ts $(git rev-parse HEAD)

Bir shell değişkeni kullanarak başka bir örnek:

REV=$(git rev-parse HEAD) && deno run main.ts $REV && echo $REV

Çıkış kodunu olumsuzlama

Çıkış kodunu olumsuzlamak için, bir komuttan önce bir ünlem işareti ve bir boşluk ekleyin:

# çıkış kodunu 1'den 0'a değiştir
! deno eval 'Deno.exit(1);'

Yönlendirmeler

Yönlendirmeler stdout ve/veya stderr çıktısını bir dosyaya yönlendirmek için bir yol sağlar.

Örneğin, aşağıdaki komut, deno run main.ts'nin stdout'unu dosya sisteminde bulunan file.txt adlı bir dosyaya yönlendirir:

deno run main.ts > file.txt

Bunun yerine stderr'yi yönlendirmek için, 2> kullanın:

deno run main.ts 2> file.txt

Her ikisini de aynı anda yönlendirmek için, &> kullanın:

deno run main.ts &> file.txt

Bir dosyayı üst üste yazmak yerine eklemek için, birden fazla sağ açılı parantez kullanın:

deno run main.ts >> file.txt

Bir komutun stdout, stderr veya her ikisini de bastırmak, /dev/null'a yönlendirerek mümkündür. Bu, Windows dahil çok platformlu bir şekilde çalışır.

# stdout'ı bastır
deno run main.ts > /dev/null
# stderr'yi bastır
deno run main.ts 2> /dev/null
# hem stdout'ı hem de stderr'yi bastır
deno run main.ts &> /dev/null

Ya da stdout'u stderr'e ve vice-versa yönlendirmek:

# stdout'u stderr'e yönlendir
deno run main.ts >&2
# stderr'yi stdout'a yönlendir
deno run main.ts 2>&1

Girdi yönlendirmeleri de desteklenir:

# file.txt'i gzip'in stdin'ine yönlendir
gzip < file.txt

Birden fazla yönlendirme yönlendirmesinin şu anda desteklenmediğini unutmayın.

Çok platformlu shebang

Deno 1.42'den itibaren, deno task, #!/usr/bin/env -S ile başlayan betikleri tüm platformlarda aynı şekilde çalıştıracaktır.

Örneğin:

script.ts
#!/usr/bin/env -S deno run
console.log("Merhaba!");
deno.json
{
"tasks": {
"hi": "./script.ts"
}
}

Ardından bir Windows makinesinde:

> pwd
C:\Users\david\dev\my_project
> deno task hi
Merhaba!

Glob genişletmesi

Glob genişletmesi Deno 1.34 ve üzeri sürümlerde desteklenmektedir. Bu, dosyaları eşleştirmek için globların belirtilmesini sağlar.

# mevcut ve alt dizinlerdeki .ts dosyalarını eşleştirin
echo **/*.ts
# mevcut dizindeki .ts dosyalarını eşleştirin
echo *.ts
# "data" ile başlayıp, tek bir rakam içeren ve sonra .csv ile biten dosyaları eşleştirin
echo data[0-9].csv

Desteklenen glob karakterleri *, ? ve [/].

Yerleşik komutlar

deno task, Windows, Mac ve Linux'da kutudan çıktığı gibi çalışan birkaç yerleşik komut ile birlikte gelir.

  • cp - Dosyaları kopyalar.
  • mv - Dosyaları taşır.
  • rm - Dosyaları veya dizinleri kaldırır.
    • Ör. rm -rf [DOSYA]... - Genellikle dosyaları veya dizinleri özyinelemeli olarak silmek için kullanılır.
  • mkdir - Dizinler oluşturur.
    • Ör. mkdir -p DİREKTORY... - Bir dizin ve tüm üst dizinlerini oluşturmak için genellikle kullanılır ve mevcutsa hata vermez.
  • pwd - Geçerli/çalışma dizininin adını yazdırır.
  • sleep - Belirtilen süre kadar gecikme yapar.
    • Ör. sleep 1 bir saniye beklemek için, sleep 0.5 yarım saniye beklemek için veya sleep 1m bir dakika beklemek için.
  • echo - Bir metin satırını görüntüler.
  • cat - Dosyaları birleştirir ve stdout'da çıktısını verir. Argüman verilmediğinde stdin okur ve çıktı verir.
  • exit - Shell'in çıkmasını sağlar.
  • head - Bir dosyanın ilk kısmını çıktı verir.
  • unset - Ortam değişkenlerini kaldırır.
  • xargs - stdin'den argümanlar oluşturur ve bir komutu çalıştırır.

Eğer bir komutta yararlı bir bayrak eksik olduğunu düşünüyorsanız veya kutudan çıkmadan desteklenmesi gereken ek komutlar için herhangi bir öneriniz varsa, bir sorun açın deno_task_shell reposunda.

Bu komutlardan herhangi birini Mac veya Linux'ta çok platformlu bir şekilde çalıştırmak istemeniz durumunda, bunu sh üzerinden çalıştırarak yapabilirsiniz: sh -c (ör. sh -c cp kaynak hedef).

package.json desteği

deno task, bir package.json dosyasında "scripts" girişlerinden okuma yapmak için geri dönmektedir. Deno'nun herhangi bir npm yaşam döngüsü olayını desteklemediğini veya saygı göstermediğini unutmayın, preinstall veya postinstall gibi - hangi betik girişlerini çalıştırmak istediğinizi açıkça çalıştırmalısınız (ör. deno install --entrypoint main.ts && deno task postinstall).