ฉันมีโครงการ Heroku ที่ใช้ตัวแปรสภาพแวดล้อมเพื่อรับการกำหนดค่า แต่ฉันใช้ virtualenv เพื่อทดสอบแอปของฉันในเครื่องก่อน
มีวิธีการตั้งค่าตัวแปรสภาพแวดล้อมที่กำหนดไว้ในเครื่องระยะไกลภายใน virtualenv หรือไม่?
ฉันมีโครงการ Heroku ที่ใช้ตัวแปรสภาพแวดล้อมเพื่อรับการกำหนดค่า แต่ฉันใช้ virtualenv เพื่อทดสอบแอปของฉันในเครื่องก่อน
มีวิธีการตั้งค่าตัวแปรสภาพแวดล้อมที่กำหนดไว้ในเครื่องระยะไกลภายใน virtualenv หรือไม่?
คำตอบ:
ตั้งแต่วันที่ 17 พฤษภาคม 2017 README ของ autoenv ระบุว่าdirenvน่าจะเป็นตัวเลือกที่ดีกว่าและนัย autoenv ไม่ได้รับการบำรุงรักษาอีกต่อไป
ฉันเขียน autoenv เพื่อทำสิ่งนี้:
.env
ไฟล์ที่ Herork สร้างขึ้นอย่างน้อยก็ในประสบการณ์ของฉัน ดังนั้นอย่ารวมไว้ใน repo ของคุณ ผู้ใช้ / แฟนตัวยงของ autoenv btw สวัสดี Kenneth คุณ da man!
ในกรณีที่คุณกำลังใช้virtualenvwrapper (ผมขอแนะนำให้ทำเช่นนั้น) คุณสามารถกำหนดตะขอที่แตกต่างกัน (preactivate, postactivate, predeactivate, postdeactivate) $VIRTUAL_ENV/bin/
โดยใช้สคริปต์ที่มีชื่อเดียวกันใน คุณต้องตะขอ postactivate
$ workon myvenv
$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export DJANGO_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret
$ echo $DJANGO_DEBUG
True
หากคุณต้องการที่จะให้การกำหนดค่านี้ในไดเรกทอรีโครงการของคุณเพียงแค่สร้าง symlink $VIRTUAL_ENV/bin/postactivate
จากไดเรกทอรีโครงการของคุณ
$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
คุณสามารถสร้างการเชื่อมโยงได้ทุกครั้งที่คุณใช้mkvirtualenv
จำไว้ว่าสิ่งนี้จะไม่ทำความสะอาดหลังจากนั้น เมื่อคุณปิดใช้งาน virtualenv ตัวแปรสภาพแวดล้อมจะยังคงมีอยู่ $VIRTUAL_ENV/bin/predeactivate
ในการทำความสะอาดแฟ่คุณสามารถเพิ่ม
$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG
$ deactivate
$ echo $DJANGO_DEBUG
โปรดจำไว้ว่าหากใช้สิ่งนี้กับตัวแปรสภาพแวดล้อมที่อาจตั้งค่าไว้แล้วในสภาพแวดล้อมของคุณการยกเลิกการตั้งค่าจะส่งผลให้ตัวแปรเหล่านั้นถูกยกเลิกการตั้งค่าอย่างสมบูรณ์เมื่อออกจาก virtualenv ดังนั้นหากเป็นไปได้คุณสามารถบันทึกค่าก่อนหน้านี้ที่ใดที่หนึ่งชั่วคราวจากนั้นให้อ่านค่าในที่ปิดใช้งาน
ติดตั้ง:
$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=apple
$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
export SOME_VAR=$SOME_VAR_BACKUP
unset SOME_VAR_BACKUP
else
unset SOME_VAR
fi
ทดสอบ:
$ echo $SOME_VAR
banana
$ workon myenv
$ echo $SOME_VAR
apple
$ deactivate
$ echo $SOME_VAR
banana
ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate
ไม่ได้ผลสำหรับฉัน ln
ต้องการเส้นทางที่เต็มดังนั้นฉันต้องทำln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
ln
ทางญาติทำงาน
คุณสามารถลอง:
export ENVVAR=value
ใน virtualenv_root / bin / เปิดใช้งาน โดยพื้นฐานแล้วสคริปต์การเปิดใช้งานคือสิ่งที่ถูกดำเนินการเมื่อคุณเริ่มใช้ virtualenv เพื่อให้คุณสามารถกำหนดเองทั้งหมดของคุณได้
deactivate
ฟังก์ชั่นที่กำหนด virtualenv_root / bin / เปิดใช้งานเพื่อความสมดุลของการตั้งค่าและ
การใช้ virtualenv เท่านั้น (โดยไม่ต้องvirtualenvwrapper ) การตั้งค่าตัวแปรสภาพแวดล้อมนั้นทำได้ง่ายผ่านactivate
สคริปต์ที่คุณจัดหาเพื่อเปิดใช้งาน virtualenv
วิ่ง:
nano YOUR_ENV/bin/activate
เพิ่มตัวแปรสภาพแวดล้อมลงท้ายไฟล์ดังนี้:
export KEY=VALUE
คุณยังสามารถตั้งค่า hook ที่คล้ายกันเพื่อยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมตามที่ Danilo Bargen แนะนำไว้ในคำตอบที่ดีของเขาด้านบนหากคุณต้องการ
cd
เพียงเพื่อให้มีตัวแปรสภาพแวดล้อม? ตัวสั่น
ในขณะที่มีคำตอบที่ดีมากมายที่นี่ฉันไม่เห็นวิธีการโพสต์ที่ทั้งสองรวมถึงการตั้งค่าตัวแปรสภาพแวดล้อมในการปิดการใช้งานและไม่จำเป็นต้องมีห้องสมุดเพิ่มเติมนอกเหนือจากvirtualenv
นี้ดังนั้นนี่เป็นทางออกของฉัน ตัวแปรMY_SERVER_NAME
และMY_DATABASE_URL
เป็นตัวอย่าง:
ควรมีคำจำกัดความสำหรับการปิดใช้งานในสคริปต์เปิดใช้งานและคุณต้องการยกเลิกการตั้งค่าตัวแปรของคุณเมื่อสิ้นสุด:
deactivate () {
...
# Unset My Server's variables
unset MY_SERVER_NAME
unset MY_DATABASE_URL
}
จากนั้นในตอนท้ายของสคริปต์เปิดใช้งานให้ตั้งค่าตัวแปร:
# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"
วิธีนี้คุณไม่จำเป็นต้องติดตั้งอะไรอีกเพื่อให้มันทำงานได้และคุณไม่ต้องเจอกับตัวแปรdeactivate
ที่ค้างอยู่เมื่อคุณใช้ virtualenv
ภายใน virtualenv มีสองวิธีที่คุณสามารถใช้เพื่อทดสอบนี้ สิ่งแรกคือเครื่องมือที่ติดตั้งผ่าน Heroku toolbelt เครื่องมือนี้เป็นหัวหน้าคนงาน มันจะส่งออกตัวแปรสภาพแวดล้อมทั้งหมดของคุณที่เก็บไว้ในไฟล์. env ในเครื่องจากนั้นเรียกใช้กระบวนการแอปภายใน Procfile ของคุณ
วิธีที่สองหากคุณกำลังมองหาวิธีที่เบากว่าคือการมีไฟล์. env อยู่ภายในเครื่องให้รัน
export $(cat .env)
ติดตั้งautoenvโดย
$ pip install autoenv
(หรือ)
$ brew install autoenv
จากนั้นสร้าง.env
ไฟล์ในโฟลเดอร์โครงการ virtualenv ของคุณ
$ echo "source bin/activate" > .env
ตอนนี้ทุกอย่างทำงานได้ดี
อีกวิธีในการทำที่ออกแบบมาสำหรับ django แต่ควรทำงานในการตั้งค่าส่วนใหญ่คือการใช้ django-dotenv
ในการเปิดใช้งาน virtualenv ในenv
ไดเรกทอรีและส่งออกตัวแปรที่เก็บไว้ในการ.env
ใช้งาน:
source env/bin/activate && set -a; source .env; set +a
echo 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases