Saya punya tugas menyapu yang perlu memasukkan nilai ke beberapa basis data.
Saya ingin meneruskan nilai ini ke tugas menyapu dari baris perintah, atau dari tugas menyapu lain .
Bagaimana saya bisa melakukan ini?
ruby
command-line
rake
command-line-arguments
Tilendor
sumber
sumber
Jawaban:
opsi dan dependensi harus ada di dalam array:
Kemudian
CATATAN KERETA API:
sumber
rake thing:work[1, 2, 3]
karena tidak akan berhasil dan Anda akan mendapatkan kesalahanDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
rake 'thing:work[1,2,3]'
:environment
simbol dari tugas Anda. aplikasi rel memiliki: tugas lingkungan ...t
artinyatask
, mengapa tidak hanya menggunakantask
sebagai nama param?Anda bisa menentukan argumen formal di rake dengan menambahkan argumen simbol ke panggilan tugas. Sebagai contoh:
Kemudian, dari baris perintah:
Seperti yang ditunjukkan dalam contoh kedua, jika Anda ingin menggunakan spasi, tanda kutip di sekitar nama target diperlukan untuk menjaga shell agar tidak memecah argumen di spasi.
Melihat kode di rake.rb , tampaknya rake tidak menguraikan string tugas untuk mengekstraksi argumen untuk prasyarat, jadi Anda tidak bisa melakukannya
task :t1 => "dep[1,2]"
. Satu-satunya cara untuk menentukan argumen yang berbeda untuk prasyarat adalah dengan memanggilnya secara eksplisit dalam aksi tugas dependen, seperti pada:invoke_my_task
dan:invoke_my_task_2
.Perhatikan bahwa beberapa cangkang (seperti zsh) mengharuskan Anda untuk keluar dari kurung:
rake my_task\['arg1'\]
sumber
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), sehingga Anda perlu untuk melarikan diri kurung:rake my_task\['arg1'\]
. Dari robots.thoughtbot.com/post/18129303042/…Selain menjawab dengan kch (saya tidak menemukan cara untuk meninggalkan komentar itu, maaf):
Anda tidak harus menentukan variabel sebagai
ENV
variabel sebelumrake
perintah. Anda bisa mengaturnya sebagai parameter baris perintah seperti biasa:dan akses yang dari file rake Anda sebagai variabel ENV seperti:
sumber
p
artinya?Jika Anda ingin memberikan argumen bernama (misalnya dengan standar
OptionParser
), Anda dapat menggunakan sesuatu seperti ini:perhatikan
--
, itu perlu untuk melewati argumen Rake standar. Harus bekerja dengan Rake 0.9.x , <= 10.3.x .Rake yang lebih baru telah mengubah penguraiannya
--
, dan sekarang Anda harus memastikan itu tidak lolos keOptionParser#parse
metode, misalnya denganparser.parse!(ARGV[2..-1])
exit
pada akhirnya akan memastikan bahwa argumen tambahan tidak akan ditafsirkan sebagai tugas Rake.Juga jalan pintas untuk argumen harus berfungsi:
Ketika skrip rake terlihat seperti ini, mungkin sudah waktunya untuk mencari alat lain yang akan memungkinkan ini keluar dari kotak.
sumber
--option-names
. Saya hanya saran akan menggunakanexit
daripadaabort
sebagaiabort
akan meninggalkan Anda dengan kode kembali 1 ke shell. Jika tugas menyapu adalah bagian dari skrip tingkat yang lebih tinggi itu lebih umum untuk menganggap keluar tidak nol adalah beberapa jenis kesalahan.--
? Suka menyampaikanrake
argumen ke tugas aktual atau sesuatu? Sukatask :my_task, :*args do |t, args|
atau apalah?{username}
sini. Di mana itu digunakan? Kenapa tidak ada di sana-u {username}
? Cheers10.4.1
dan dikembalikan10.4.2
. github.com/ruby/rake/commit/…Saya telah menemukan jawaban dari dua situs web ini: Net Maniac dan Aimred .
Anda harus memiliki versi> 0.8 rake untuk menggunakan teknik ini
Deskripsi tugas menyapu normal adalah ini:
Untuk menyampaikan argumen, lakukan tiga hal:
Untuk mengakses argumen dalam skrip, gunakan args.arg_name
Untuk memanggil tugas ini dari baris perintah, berikan argumen di [] s
akan menampilkan
dan jika Anda ingin memanggil tugas ini dari tugas lain, dan meneruskannya argumen, gunakan invoke
lalu perintahnya
akan menampilkan
Saya belum menemukan cara untuk meneruskan argumen sebagai bagian dari dependensi, karena kode berikut rusak:
sumber
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Pilihan lain yang umum digunakan adalah untuk melewatkan variabel lingkungan. Dalam kode Anda, Anda membacanya melalui
ENV['VAR']
, dan dapat mengirimkannya tepat sebelumrake
perintah, sepertisumber
rake blah -- --these --go --to --a-program
(perhatikan--
untuk memberi tahu rake bahwa switch-nya telah berakhir), lihat stackoverflow.com/questions/5086224/…Sebenarnya @Nick Desjardins menjawab sempurna. Tetapi hanya untuk pendidikan: Anda dapat menggunakan pendekatan kotor: menggunakan
ENV
argumensumber
Saya tidak tahu bagaimana cara melewatkan argumen dan juga: lingkungan sampai saya menyelesaikannya:
Dan kemudian saya sebut seperti ini:
sumber
sumber
rake task_name[hello, world]
Saya hanya ingin bisa berlari:
Sederhana bukan? (Nggak!)
Rake penafsiran
arg1
danarg2
sebagai tugas, dan mencoba menjalankannya. Jadi kita batalkan saja.Ambillah itu, kurung!
Penafian : Saya ingin dapat melakukan ini dalam proyek hewan peliharaan yang cukup kecil. Tidak dimaksudkan untuk penggunaan "dunia nyata" karena Anda kehilangan kemampuan untuk melakukan tugas menyapu (yaitu
rake task1 task2 task3
). IMO tidak sepadan. Cukup gunakan yang jelekrake task[arg1,arg2]
.sumber
_, arg1, arg2 = ARGV
sebagai argumen pertama yang dilihat sebagai nama tugas menyapu. Tapi ituexit
trik yang rapi.rake task[arg1,arg2] && rake task2 && rake task3
Tidak yakin apakah itu kurang jelek dari iturake task[arg1,arg2] task2 task3
. Mungkin kurang efisien._, *args = ARGV
sempurna untuk menangkap semua argumen selanjutnya! Terima kasih banyak!Saya menggunakan argumen ruby biasa dalam file rake:
kemudian saya mematikan tugas rake di bagian bawah file (karena rake akan mencari tugas berdasarkan nama argumen itu).
garis komando:
ini terasa lebih bersih bagi saya daripada solusi var = foo ENV var dan args [blah, blah2].
rintisannya sedikit jenky, tetapi tidak terlalu buruk jika Anda hanya memiliki beberapa lingkungan yang merupakan pengaturan satu kali
sumber
dup
di akhir: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
untuk mencegah pengecualian duping nol.Cara menyampaikan argumen sudah benar dalam jawaban di atas. Namun untuk menjalankan tugas menyapu dengan argumen, ada sedikit teknis yang terlibat dalam versi rel yang lebih baru
Ini akan bekerja dengan rake "namespace: taskname ['argument1']"
Perhatikan kutipan terbalik dalam menjalankan tugas dari baris perintah.
sumber
Untuk meneruskan argumen ke tugas default, Anda dapat melakukan sesuatu seperti ini. Misalnya, katakan "versi" adalah argumen Anda:
Maka Anda dapat menyebutnya seperti ini:
atau
atau
Namun, saya belum menemukan cara untuk menghindari menentukan nama tugas (default atau build) saat menyampaikan argumen. Akan sangat senang mendengar jika ada yang tahu cara.
sumber
Saya suka sintaks "querystring" untuk argumen yang lewat, terutama ketika ada banyak argumen yang harus disampaikan.
Contoh:
The "querystring" adalah:
Peringatan: perhatikan bahwa sintaksnya adalah
rake "mytask[foo=bar]"
dan TIDAKrake mytask["foo=bar"]
Ketika diuraikan di dalam tugas menyapu menggunakan
Rack::Utils.parse_nested_query
, kita mendapatkanHash
:(Yang keren adalah Anda bisa melewati hash dan array, lebih lanjut di bawah)
Inilah cara mencapai ini:
Berikut adalah contoh yang lebih luas yang saya gunakan dengan Rails di blog saya permata menunda_job_active_record_threaded :
Diurai dengan cara yang sama seperti di atas, dengan ketergantungan lingkungan (untuk memuat lingkungan Rails)
Memberi yang berikut di
options
sumber
Jika Anda tidak dapat diganggu untuk mengingat apa posisi argumen untuk apa dan Anda ingin melakukan sesuatu seperti hash argumen ruby. Anda bisa menggunakan satu argumen untuk meneruskan string dan kemudian regex string itu menjadi hash opsi.
Dan di baris perintah Anda dapatkan.
sumber
Sebagian besar metode yang dijelaskan di atas tidak bekerja untuk saya, mungkin mereka sudah usang dalam versi yang lebih baru. Panduan terbaru dapat ditemukan di sini: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
copy dan paste ans dari panduan ada di sini:
Panggil seperti ini
sumber
Untuk menjalankan tugas menyapu dengan gaya argumen tradisional:
Dan kemudian gunakan:
Tambahkan sepetak permata menyapu berikut:
sumber
Ketika melewati parameter, pilihan yang lebih baik adalah file input, dapatkah ini menjadi excel json atau apa pun yang Anda butuhkan dan dari sana baca struktur data dan variabel yang Anda perlukan dari itu termasuk nama variabel sebagaimana kebutuhan. Untuk membaca file dapat memiliki struktur berikut.
Contoh json
Eksekusi
sumber