Saya ingin menjalankan skrip fabric saya secara lokal, yang pada gilirannya, masuk ke server saya, beralih pengguna untuk menyebarkan, mengaktifkan proyek .virtualenv, yang akan mengubah dir ke proyek dan mengeluarkan tarikan git.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Saya biasanya menggunakan perintah workon dari virtualenvwrapper yang sumber file aktifkan dan file postactivate akan menempatkan saya di folder proyek. Dalam kasus ini, tampaknya karena kain beroperasi dari dalam shell, kontrol diberikan ke kain, jadi saya tidak dapat menggunakan sumber bawaan bash ke '$ source ~ / .virtualenv / myvenv / bin / activ'
Adakah yang punya contoh dan penjelasan tentang bagaimana mereka melakukan ini?
python
virtualenv
fabric
automated-deploy
Thomas Schreiber
sumber
sumber
workon
sebagaiprefix
?Jawaban:
Saat ini, Anda dapat melakukan apa yang saya lakukan, yang kludgy tetapi bekerja dengan sangat baik * (penggunaan ini mengasumsikan Anda menggunakan virtualenvwrapper - yang seharusnya - tetapi Anda dapat dengan mudah mengganti 'panggilan' sumber yang agak lama Anda sebutkan. , jika tidak):
Sejak versi 1.0, Fabric memiliki
prefix
manajer konteks yang menggunakan teknik ini sehingga Anda dapat misalnya:* Ada kemungkinan ada kasus di mana menggunakan
command1 && command2
pendekatan dapat meledak pada Anda, seperti ketikacommand1
gagal (command2
tidak akan pernah berjalan) atau jikacommand1
tidak lolos dengan benar dan berisi karakter shell khusus, dan sebagainya.sumber
workon
tidak diketahui olehsh
. Bagaimana cara kami memberi tahu fabric agar menggunakan bash?source venv/bin/activate
. Lebih mudah dan berhasil di luar kotak.workon
adalah ketergantungan tambahan dan bahkan jika itu diinstal Anda harus menambahkannya.bashrc
- terlalu rumit untuk penyebaran kain.Sebagai pembaruan untuk ramalan bitprophet: Dengan Fabric 1.0 Anda dapat menggunakan awalan () dan manajer konteks Anda sendiri.
sumber
source
tidak diketahui olehsh
. Bagaimana cara kami memberi tahu fabric agar menggunakan bash?.
sebagai gantisource
cd()
saat Anda menentukan sepenuhnya jalanactivate
masukprefix()
?prefix()
sepertinya tidak cd di sana - lihat dokumen ini yang melakukan hal yang sama. Kami ingin berada dicd
sana sehingga ketika kamiyield
menjalankan perintah lain (pip freeze
dalam contoh saya), perintah-perintah itu dapat relatif terhadap direktori itu.Saya hanya menggunakan fungsi wrapper virtualenv () yang dapat dipanggil alih-alih dijalankan (). Itu tidak menggunakan manajer konteks cd, jadi jalur relatif dapat digunakan.
sumber
virtualenvwrapper
dapat membuat ini sedikit lebih sederhanaMenggunakan pendekatan @ nh2 (pendekatan ini juga berfungsi saat menggunakan
local
, tetapi hanya untuk instalasi virtualenvwrapper di manaworkon
berada$PATH
, dengan kata lain - Windows)Atau gunakan file fab Anda dan jalankan ini secara lokal. Pengaturan ini memungkinkan Anda mengaktifkan virtualenv untuk perintah lokal atau jarak jauh. Pendekatan ini sangat kuat karena bekerja di sekitar
local
ketidakmampuan untuk menjalankan .bashrc menggunakanbash -l
:sumber
Ini adalah pendekatan saya dalam menggunakan
virtualenv
dengan penyebaran lokal.Menggunakan manajer konteks path () fabric Anda dapat menjalankan
pip
ataupython
dengan binari dari virtualenv.sumber
Terima kasih atas semua jawaban yang diposting dan saya ingin menambahkan satu lagi alternatif untuk ini. Ada modul, fabric-virtualenv , yang dapat menyediakan fungsi sebagai kode yang sama:
fabric-virtualenv memanfaatkan
fabric.context_managers.prefix
, yang mungkin merupakan cara yang baik :)sumber
Jika Anda ingin menginstal paket ke lingkungan atau ingin menjalankan perintah sesuai dengan paket yang Anda miliki di lingkungan, saya telah menemukan peretasan ini untuk menyelesaikan masalah saya, alih-alih menulis metode kain yang rumit atau menginstal paket OS baru:
Dengan cara ini Anda mungkin tidak perlu mengaktifkan lingkungan, tetapi Anda dapat menjalankan perintah di bawah lingkungan.
sumber
Berikut adalah kode untuk dekorator yang akan menghasilkan penggunaan Lingkungan Virtual untuk semua panggilan run / sudo:
dan kemudian menggunakan dekorator, perhatikan urutan dekorator penting:
sumber
Pendekatan ini berhasil bagi saya, Anda dapat menerapkan ini juga.
Dengan asumsi
venv
adalah direktori virtual env Anda dan tambahkan metode ini di mana pun sesuai.sumber