เทียบเท่าทับทิมของ virtualenv?


165

มีบางสิ่งที่คล้ายกับ Python virtualenvยูทิลิตี้หรือไม่

โดยทั่วไปจะช่วยให้คุณสามารถติดตั้งแพคเกจหลามในสภาพแวดล้อม sandboxed เพื่อให้easy_install djangoไม่ได้ไปในไดเรกทอรีเว็บไซต์แพคเกจทั้งระบบของคุณก็จะไปในสมุด virtualenv สร้าง

ตัวอย่างเช่น:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin

Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer 
/Users/dbr/test/bin/tvnamer

มีบางอย่างเช่นนี้สำหรับ RubyGems หรือไม่

คำตอบ:


85

RVMทำงานใกล้ชิดกับการทำงานของ virtualenv มากขึ้นเพราะช่วยให้คุณสามารถใช้ Sandbox ruby ​​รุ่นต่าง ๆ และพลอยได้ ฯลฯ


5
ลองทั้ง sandbox และ RVM และคิดว่า RVM เป็นทางออกที่ดีกว่ามาก
ivanjovanovic

9
ivanjovanovic ทำไมคุณถึงพบ RVM ดีกว่า sandbox
pwan

68

sandbox ที่มิใช่ RVM หรือ rbenv จัดการเวอร์ชันของแอปของคุณอ้างอิงอัญมณี เครื่องมือสำหรับการว่าเป็นBundler

  • ใช้Gemfileเป็นประกาศของแอปพลิเคชันของคุณ
  • ใช้bundle installเพื่อติดตั้งเวอร์ชันที่ชัดเจนของการขึ้นต่อกันเหล่านี้ไปยังตำแหน่งที่แยกได้
  • ใช้bundle execสำหรับเรียกใช้แอปพลิเคชันของคุณ

6
นอกจากนี้โดยส่วนตัวแล้วฉันคิดว่าผู้คนใช้มากเกินไป rbenv / rvm หากคุณไม่จำเป็นต้องมี ruby ​​หลายรุ่นแยกกันบนเครื่องเดียวกัน - และคุณอาจไม่ต้อง - อย่าใช้ rbenv / rvm "นามธรรม" ของพวกเขาไม่ได้มาฟรี; ฉันรับประกันคุณจะต้องใช้เวลาแก้จุดบกพร่องในบางจุด คำแนะนำของฉัน: เพียงแค่ติดตั้งทับทิมด้วยตัวจัดการแพ็คเกจของระบบปฏิบัติการของคุณ ล่าสุดเป็นสิ่งที่ยิ่งใหญ่ที่สุด
pje

6
ฉันพลาดอะไรไปรึเปล่า? Bundler ยังคงพยายามที่จะติดตั้งระบบแพคเกจกว้างโดยค่าเริ่มต้น
Detly

6
สภาพแวดล้อมที่แยกตัวออกมานั้นค่อนข้างไม่เป็นตัวเลือกในกระบวนการทำงานที่ทันสมัย หากคุณพึ่งพาระบบ ruby ​​และ system package manager คุณจะไม่รับประกันว่าการติดตั้งของคุณจะทำซ้ำได้ ของหลักสูตรที่คุณจะได้รับเป็นครั้งคราวจมลงไปต่อสู้กับมอนสเตอร์ที่ติดตั้ง นั่นเป็นสิ่งที่ดี เพราะคุณแก้ปัญหาในสภาพแวดล้อมการพัฒนาของคุณเพื่อให้คุณไม่ต้องแก้พวกเขาในสภาพแวดล้อมที่อยู่ของคุณ หากต้องการรับรหัสซ้ำอย่าใช้สภาพแวดล้อมของระบบ ใช้สภาพแวดล้อมที่แยกเพื่อประโยชน์สติ
Shayne

19

ดูเหมือนจะไม่มีใครได้กล่าวถึงrbenv


rbenv เป็นผู้จัดการ ruby ​​แต่มันอยู่ในระดับแพ็คเกจ (เทียบเท่า virtualenv) มันไม่ได้มีตัวจัดการ gemset แต่กำเนิดเพื่อให้สามารถนำเสนอ env เสมือนได้
yekta

16

ฉันคิดว่าคุณจะชอบSandbox


9
อึศักดิ์สิทธิ์ที่เขียนใหม่$HOME! สิ่งที่นรกไม่ต้องอัญมณีที่หา? สิ่งที่น่าเศร้าก็คือสิ่งที่ดีที่สุดที่ฉันเคยเห็นสำหรับงาน แม้แต่ตัวกำหนดค่าเริ่มต้นของการติดตั้งในเส้นทาง ruby ​​ของระบบ
Chris R

6
sandbox ยังไม่ได้รับการปรับปรุงใน ~ 4 ปี (การกระทำครั้งสุดท้ายเมื่อเดือนธันวาคม 2008), RVM ยังอยู่ในการพัฒนา (การกระทำล่าสุดคือเมื่อวานนี้)
dbr

16

ฉันจะพูดถึงวิธีการทำเช่นนี้กับ Bundler (ซึ่งฉันใช้กับ RVM - RVM เพื่อจัดการทับทิมและชุดเริ่มต้นของอัญมณีทั่วโลก Bundler เพื่อจัดการอัญมณีเฉพาะโครงการ)

bundler install --binstubs --path vendor

การรันคำสั่งนี้ในรูทของโปรเจ็กต์จะติดตั้งอัญมณีที่แสดงรายการจาก Gemfile ของคุณใส่ libs ./vendorและเอ็กซีคิ้วท์ใด ๆ ใน./binและทั้งหมดrequires (ถ้าคุณใช้bundle consoleหรือ Bundler ต้องการ) จะอ้างอิง exes และ libs เหล่านี้

การทำงานสำหรับฉัน


คำแนะนำเล็กน้อยสำหรับผู้ที่อยู่ใน macOS หากคุณตั้งชื่อพา ธvendor.noindexการค้นหาที่น่าสนใจของคุณจะไม่สับสนกับข้อมูลที่จัดทำดัชนีจากอัญมณีที่ถูกซื้อมา
Iain

1
นี่คือสิ่งที่ฉันทำด้วย (ด้วยrbenvแต่นั่นเป็นอีกเรื่อง) เนื่องจากมันแยก gemset และรุ่น ruby ไม่มีอะไรที่มีการติดตั้ง systemwide และทุกโครงการมีการอ้างอิงทั้งหมดก็ประกาศอย่างดี เคล็ดลับ: ใช้bundle config path vendorอย่าลืมข้อโต้แย้งนั้น
nandilugio

15

หากคุณต้องการติดตั้งอัญมณีในรูปแบบที่ไม่ใช่รูทให้ลองตั้งค่าGEM_HOMEตัวแปรสภาพแวดล้อม gemจากนั้นเรียกเพียง

ตัวอย่างเช่น:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc

! น่ากลัว ใน OSX โฟลเดอร์นั้นถูกซ่อนอยู่:export GEM_HOME=$HOME/.local/gems
Bruno

1
มันอาจจะใช้งานง่ายกว่าGEM_HOME=$HOME/.localดังนั้นมันจึงแชร์.binโฟลเดอร์เดียวกัน ในกรณีนี้เราไม่จำเป็นต้องอัพเดต$PATHตัวแปรของเรา
Bruno


โดยวิธีการที่ไม่มีการพึ่งพาที่สะอาดที่สุดเท่าที่ฉันเคยเห็นสำหรับการติดตั้งเครื่องมือซึ่งไม่ทำลายซึ่งกันและกันเมื่ออัปเดต (ทั้งหมดที่เหลืออยู่คือการเพิ่มนามแฝงในของคุณ~/.bashrcและคุณเสร็จแล้ว) +1
Paradoxis

4

ผมขอแนะนำให้direnv มันเป็นสภาพแวดล้อมสำหรับการสลับเปลือก

ก่อนที่แต่ละพรอมต์จะตรวจสอบว่ามีไฟล์ ".envrc" ในไดเรกทอรีปัจจุบันและพาเรนต์หรือไม่ หากไฟล์นั้นมีอยู่ (และได้รับอนุญาต) ไฟล์นั้นจะถูกโหลดลงในเชลล์ย่อยของ bash และตัวแปรที่ส่งออกทั้งหมดจะถูกดักจับโดย direnv จากนั้นทำให้พร้อมใช้งานเชลล์ปัจจุบัน

นี่คือวิธีการใช้ direnvกับ ruby-install

+ ทับทิมติดตั้ง

เพิ่มนี้ไป ~/.direnvrc

use_ruby() {
  local ruby_root=$HOME/.rubies/$1
  load_prefix "$ruby_root"
  layout_ruby
}

ติดตั้ง ruby-install ( brew install ruby-install) และติดตั้งทับทิมจำนวนมาก

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

จากนั้นสร้าง symlink สองสามชุดเพื่อความสะดวก

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

และในที่สุดโครงการของใด ๆ.envrc:

use ruby 2.0

สิ่งนี้จะทำให้พลอยทั้งหมดอยู่ใน.direnv/rubyไดเรกทอรีของโครงการ(ทำให้การเปิดพลอยง่ายขึ้น) Bundler จะใส่ไบนารีของ wrapper ใน .direnv/bin(ไม่มากbundle exec!)

+ rbenv

เป็นไปได้ที่จะใช้ rbenv ด้วยการเพิ่มuse rbenvคำสั่งใน.envrcไฟล์ใดก็ได้ นี้จะเปิดใช้งาน rbenv ซึ่งจะใส่ ruby ​​wrappers ในเส้นทาง

โปรดทราบว่าไม่จำเป็นต้องติดตั้ง rbenv ใน. bashrc หรือ. zshrc เพื่อให้ทำงานได้

+ RVM

นี่คือ. envrc ที่ซับซ้อนที่สุดที่ฉันใช้กับโครงการทับทิม:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

rvm ใช้เพื่อเลือกรุ่นทับทิมที่ถูกต้องสำหรับคุณ

คำสั่งเลย์เอาต์ตั้งค่าตัวแปรสภาพแวดล้อมปกติบางอย่างโดยอัตโนมัติ สำหรับตอนนี้มีเพียงเลย์เอาต์ทับทิมเท่านั้น สิ่งที่มันถูกตั้งค่าตัวแปรสภาพแวดล้อม GEM_HOME และเป็นไดเรกทอรี bin ไปยังเส้นทางของคุณ เนื่องจากมันขึ้นอยู่กับรุ่นทับทิมตรวจสอบให้แน่ใจว่าได้เรียกมันหลังจาก "rvm" เนื่องจากแต่ละไดเรกทอรีเค้าโครงทับทิมมี GEM_HOME ของตัวเองคุณไม่จำเป็นต้องใช้ gemsets RVM ของ

PATH_add prepends และขยายเส้นทางสัมพัทธ์ที่กำหนด ในกรณีนี้ฉันใช้สิ่งนี้เพื่อแยก binstubs ของ Bundler ออกจากสคริปต์ bin ของฉันเองด้วยbundle install --binstubs .direnv/bundler-bin

หากคุณต้องการทราบว่าคำสั่งเหล่านั้นทำอะไรกันตอนนี้: cat direnv stdlib| น้อยกว่า


2
ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง - จากการตรวจสอบ
jezrael

@ jezrael ขอบคุณสำหรับความคิดเห็นของคุณ!
Shin Kim

1
ซุปเปอร์ไม่มีปัญหา
jezrael

1

Mineshaftเป็นโครงการที่ฉันทำงานมาระยะหนึ่งแล้วและกำลังพัฒนาอย่างต่อเนื่อง

มันมีความสามารถในการสร้างสภาพแวดล้อมเสมือนจริงคล้ายกับการทำงานของ virtualenv และยังสามารถติดตั้ง Ruby ทั่วโลกได้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.