Pertimbangkan definisi tugas ini, disimpan sebagai fabfile.py
dan tasks.py
:
from invoke import task
<strong i="8">@task</strong>
def make(c):
c.run('env')
fab make
keluaran:
PWD=/tmp
SHLVL=1
_=/usr/bin/env
inv make
keluaran:
LC_ALL=en_US.UTF-8
NVM_DIR=/home/justinas/.nvm
LC_MEASUREMENT=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
<...> (lots of stuff in my environment)
Saya awalnya menemukan ini ketika mencoba menggunakan fpm yang memeriksa variabel PATH
untuk memeriksa bahwa executable yang diperlukan untuk berfungsi ada:
from invoke import task
<strong i="22">@task</strong>
def make(c):
c.run('fpm -s dir -t rpm -C dist --name somename .')
Ini berfungsi dengan memohon, tetapi tidak dengan hebat.
justinas<strong i="26">@js</strong>:/tmp$ fab make
{:timestamp=>"2018-05-11T13:11:26.218874+0300", :message=>"Need executable 'rpmbuild' to convert dir to rpm", :level=>:error}
justinas<strong i="27">@js</strong>:/tmp$ inv make
{:timestamp=>"2018-05-11T13:11:29.967762+0300", :message=>"Created package", :path=>"somename-1.0-1.x86_64.rpm"}
Saya menemukan deskripsi perilaku ini. Namun, tidak masuk akal saat menjalankan perintah secara lokal
Ini tipikal untuk menjalankan perintah pada sistem jarak jauh:
$ env | wc -l
41
$ ssh testdeploy01.ec2.st-av.net env | wc -l
14
$ ssh testdeploy01.ec2.st-av.net grep Env /etc/ssh/sshd_config
AcceptEnv LANG LC_*
Specifies what environment variables sent by the client will be copied into
the session's environ(7). See SendEnv in ssh_config(5) for how to configure
the client. The TERM environment variable is always sent whenever the
client requests a pseudo-terminal as it is required by the protocol. Vari-
ables are specified by name, which may contain the wildcard characters `*'
and `?'. Multiple environment variables may be separated by whitespace or
spread across multiple AcceptEnv directives. Be warned that some environ-
ment variables could be used to bypass restricted user environments. For
this reason, care should be taken in the use of this directive. The default
is not to accept any environment variables.
Seseorang dapat mencoba melewati semua variabel lingkungan dengan mengumpulkan seluruh lingkungan lokal dan mengaturnya di sisi lain, tetapi ada cukup banyak yang perlu diabaikan karena akan bertentangan dengan nilai yang sesuai untuk sistem jarak jauh, seperti PATH
, GOPATH
(jika Anda menggunakan bahasa Go), TMPDIR
, HOME
, SSH_AUTH_SOCK
, ...
Perhatikan bahwa saya hanya berbicara tentang tugas-tugas lokal. Saya bahkan telah menemukan komentar TODO yang menegaskan bahwa lingkungan yang lewat harus diaktifkan secara default untuk perintah lokal.
ah, begitu, masuk akal
@justinas Saya akhirnya menggunakan run from invoke untuk tugas lokal, saya mengimpornya seperti ini:
from invoke import run as local
<strong i="7">@task</strong>
def test(c):
local('ls')
Ini adalah facet dari # 1752 - tujuannya adalah untuk local
berperilaku seperti Invoke dan mempertahankan env, dan untuk run
berperilaku seperti SSH dan membuang env. Namun, saat ini konfigurasi yang mendorong perilaku ini tidak dibagi dengan benar - ini secara efektif merupakan bug. Kami akan segera memperbaikinya.
Terima kasih atas tanggapannya!
Saya baru saja mengalami masalah yang sama dan saya hanya ingin mencatat bahwa bukan hanya lingkungan lokal yang dibuang.
Mungkin Anda juga sudah mengetahui bug ini.
Untuk memperjelas, ini tidak berhasil untuk saya:
<strong i="8">@task</strong>
def test(c):
c.run('echo $ENV', env={'ENV': 'production'}) # no output
Untuk saat ini saya menemukan solusi ini (tidak terlalu bersih) yang dapat saya gunakan:
<strong i="12">@task</strong>
def test(c):
with c.prefix('ENV=production'):
c.run('echo $ENV') # prints "production"
Ya, sadarilah itu, terima kasih!
Anda dapat mengatakan run('...', preserve_env=True)
untuk mengatasinya untuk saat ini, IIRC.
preserve_env
sepertinya tidak ada. Mungkin Anda mengacu pada replace_env=False
?
Itu tidak memicu kesalahan tetapi lingkungan masih dibuang.
PS: Saya perlu mengatur lingkungan untuk tugas jarak jauh, bukan lokal.
Ya, maksud saya replace_env
dan anehnya itu tidak berhasil. Saya akan melihat ketika saya membagi konfigurasi antara lokal / jarak jauh (# 1752)
Saya baru saja mengalami ini juga. Saya melakukan c.run('make build')
dan tidak ada ENV saya yang berhasil (khususnya GOPATH yang menyebabkan build gagal). Menambahkan replace_env=False
memperbaikinya.
Edit: Saya melihat menurut dokumen :
run.replace_env: Benar, bukan Salah, sehingga perintah jarak jauh berjalan dengan lingkungan 'bersih' dan kosong alih-alih mewarisi salinan lingkungan proses saat ini.
Itu hanya sedikit membingungkan saya karena saya mencoba menjalankan perintah lokal.
Masalahnya masih ada saat menjalankan perintah lokal. @tokopedia
Komentar yang paling membantu
Saya baru saja mengalami ini juga. Saya melakukan
c.run('make build')
dan tidak ada ENV saya yang berhasil (khususnya GOPATH yang menyebabkan build gagal). Menambahkanreplace_env=False
memperbaikinya.Edit: Saya melihat menurut dokumen :
Itu hanya sedikit membingungkan saya karena saya mencoba menjalankan perintah lokal.