ضع في اعتبارك تعريف المهمة هذا ، الذي تم حفظه كـ fabfile.py
و tasks.py
:
from invoke import task
<strong i="8">@task</strong>
def make(c):
c.run('env')
المخرجات fab make
:
PWD=/tmp
SHLVL=1
_=/usr/bin/env
المخرجات inv make
:
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)
لقد وجدت هذا في البداية عند محاولة استخدام fpm الذي يتحقق من المتغير PATH
للتحقق من وجود الملفات التنفيذية التي يتطلبها للعمل:
from invoke import task
<strong i="22">@task</strong>
def make(c):
c.run('fpm -s dir -t rpm -C dist --name somename .')
يعمل هذا مع الاستدعاء ، ولكن ليس مع القوات المسلحة البوروندية.
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"}
لقد اكتشفت وصف هذا السلوك. ومع ذلك ، لا معنى عند تشغيل الأمر محليًا
هذا نموذجي لتشغيل الأوامر على الأنظمة البعيدة:
$ 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.
يمكن للمرء محاولة المرور عبر جميع متغيرات البيئة من خلال جمع البيئة المحلية بأكملها ووضعها على الجانب الآخر ، ولكن هناك عددًا كبيرًا يجب تجاهله لأنه سيتعارض مع القيمة المناسبة للنظام البعيد ، مثل PATH
، GOPATH
(إذا كنت تستخدم لغة Go) ، TMPDIR
، HOME
، SSH_AUTH_SOCK
، ...
لاحظ أنني أتحدث فقط عن المهام المحلية. لقد اكتشفت حتى تعليق TODO الذي يؤكد أن بيئة المرور يجب أن تكون قيد التشغيل افتراضيًا للأوامر المحلية.
آه ، أرى أنه أمر منطقي
justinas انتهى بي الأمر باستخدام التشغيل من استوردها على النحو التالي :
from invoke import run as local
<strong i="7">@task</strong>
def test(c):
local('ls')
هذا وجه من وجوه # 1752 - القصد من local
أن يتصرف مثل Invoke ويحافظ على البيئة ، و run
يتصرف بشكل صحيح مثل SSH ويتجاهل البيئة المحيطة. ومع ذلك ، في الوقت الحالي ، لا يتم تقسيم التكوينات التي تقود هذا السلوك بشكل صحيح - إنه خطأ فعال. سنقوم بإصلاحه قريبًا.
شكرا للإستجابة!
لقد اصطدمت للتو بنفس المشكلة وأردت فقط أن أشير إلى أنه لا يتم التخلص من البيئة المحلية فقط.
ربما تكون على دراية بهذا الخطأ أيضًا.
للتوضيح ، هذا لم ينجح بالنسبة لي:
<strong i="8">@task</strong>
def test(c):
c.run('echo $ENV', env={'ENV': 'production'}) # no output
في الوقت الحالي ، وجدت هذا الحل البديل (ليس نظيفًا جدًا) الذي يمكنني استخدامه:
<strong i="12">@task</strong>
def test(c):
with c.prefix('ENV=production'):
c.run('echo $ENV') # prints "production"
نعم ، على علم بذلك ، شكرًا!
يمكنك أن تقول run('...', preserve_env=True)
للتغلب على ذلك الآن ، IIRC.
preserve_env
غير موجود. ربما كنت تشير إلى replace_env=False
؟
لا يؤدي ذلك إلى حدوث خطأ ولكن لا يزال يتم تجاهل البيئة.
ملاحظة: أحتاج إلى ضبط البيئة للمهام البعيدة ، وليس المحلية.
نعم ، قصدت replace_env
ومن الغريب أن هذا لا يعمل. سألقي نظرة عندما أقوم بتقسيم التكوين بين محلي / بعيد (# 1752)
أنا فقط واجهت هذا أيضا. كنت أقوم بعمل c.run('make build')
ولم ينجح أي من ENV (تحديدًا GOPATH الذي تسبب في فشل الإنشاء). إضافة replace_env=False
إصلاحه.
تحرير: أرى وفقًا للمستندات :
run.replace_env: صحيح ، بدلاً من False ، بحيث تعمل الأوامر البعيدة مع بيئة فارغة "نظيفة" بدلاً من وراثة نسخة من بيئة العملية الحالية.
لقد كان الأمر محيرًا بعض الشيء بالنسبة لي لأنني كنت أحاول تشغيل أمر محلي.
لا تزال المشكلة قائمة عند تشغيل الأمر المحلي. تضمين التغريدة
التعليق الأكثر فائدة
أنا فقط واجهت هذا أيضا. كنت أقوم بعمل
c.run('make build')
ولم ينجح أي من ENV (تحديدًا GOPATH الذي تسبب في فشل الإنشاء). إضافةreplace_env=False
إصلاحه.تحرير: أرى وفقًا للمستندات :
لقد كان الأمر محيرًا بعض الشيء بالنسبة لي لأنني كنت أحاول تشغيل أمر محلي.