Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

Direnv: จัดการตัวแปรสภาพแวดล้อมเฉพาะโปรเจกต์อย่างราบรื่นสำหรับ Linux และ macOS

direnv เป็นส่วนขยายโอเพนซอร์สที่มีประโยชน์สำหรับเชลล์ของคุณบนระบบปฏิบัติการ UNIX เช่น Linux และ macOS โปรแกรมนี้คอมไพล์เป็นไฟล์รันได้แบบคงที่ (single static executable) และรองรับเชลล์อย่าง bash, zsh, tcsh, และ fish

จุดประสงค์หลักของ direnv

จุดประสงค์หลักของ direnv คือการอนุญาตให้ใช้ตัวแปรสภาพแวดล้อมเฉพาะโปรเจกต์โดยไม่ทำให้ ~/.profile หรือไฟล์เริ่มต้นเชลล์ที่เกี่ยวข้องอื่นๆ แลกแหลม มันนำเสนอวิธีใหม่ในการโหลดและยกเลิกการโหลดตัวแปรสภาพแวดล้อมโดยอิงตามไดเรกทอรีปัจจุบัน

โปรแกรมนี้ใช้สำหรับโหลดตัวแปรสภาพแวดล้อมของแอป 12factor (วิธีการสร้างแอป SaaS) สร้างสภาพแวดล้อมพัฒนาที่แยกจากกันต่อโปรเจกต์ และโหลดข้อมูลลับสำหรับการปรับใช้ นอกจากนี้ยังสามารถใช้สร้างโซลูชันการติดตั้งและจัดการหลายเวอร์ชันได้ เช่นเดียวกับ rbenv, pyenv, และ phpenv

Direnv ทำงานอย่างไร?

ก่อนที่เชลล์จะโหลดพรอมต์คำสั่ง direnv จะตรวจสอบความมีอยู่ของไฟล์ .envrc ในไดเรกทอรีปัจจุบัน (ซึ่งคุณสามารถแสดงได้ด้วยคำสั่ง pwd) และไดเรกทอรีผู้ปกครอง กระบวนการตรวจสอบนี้รวดเร็วและไม่สามารถสังเกตเห็นได้ในแต่ละพรอมต์

เมื่อพบไฟล์ .envrc ที่มีสิทธิ์เหมาะสม มันจะโหลดไฟล์นั้นเข้าไปใน bash sub-shell และจับตัวแปรที่ส่งออกทั้งหมด ทำให้พร้อมใช้งานในเชลล์ปัจจุบัน

การติดตั้ง direnv ในระบบ Linux

ในการแจกจ่าย Linux ส่วนใหญ่ แพ็กเกจ direnv พร้อมให้ติดตั้งจากที่เก็บเริ่มต้นโดยใช้ตัวจัดการแพ็กเกจของระบบ ดังนี้:

$ sudo apt install direnv #Debian,Ubuntu และ Mint
$ sudo dnf install direnv #Fedora

ในการแจกจ่ายอื่นๆ เช่น Red Hat Enterprise Linux (RHEL) และ CentOS หรือการแจกจ่ายใดๆ ที่รองรับ snaps คุณสามารถติดตั้งเป็น snap ซึ่งต้องมี snapd ติดตั้งอยู่ในระบบ

$ sudo snap install direnv

วิธีเชื่อม direnv เข้ากับเชลล์ Bash ของคุณ

หลังจากติดตั้ง direnv แล้ว คุณต้องเชื่อมมันเข้ากับเชลล์ Linux ปัจจุบันของคุณ ตัวอย่างเช่นสำหรับ Bash ให้เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.bashrc

ตรวจสอบให้แน่ใจว่ามันปรากฏแม้หลังจาก rvm, git-prompt และส่วนขยายเชลล์อื่นๆ ที่จัดการพรอมต์

eval "$(direnv hook bash)"

สำหรับ ZSH Shell

เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.zshrc:

eval "$(direnv hook zsh)"

สำหรับ FISH Shell

เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.config/fish/config.fish:

eval (direnv hook fish)

จากนั้นปิดหน้าต่างเทอร์มินัลที่ใช้งานอยู่และเปิดเชลล์ใหม่ หรือ source ไฟล์ตามที่แสดง:

$ source ~/.bashrc
$ source ~/.zshrc
$ source ~/.config/fish/config.fish

วิธีใช้ direnv ในเชลล์ Linux

เพื่อสาธิตว่า direnv ทำงานอย่างไร เราจะสร้างไดเรกทอรีใหม่ชื่อ tecmint_projects และเข้าไปในนั้น

$ mkdir ~/tecmint_projects
$ cd tecmint_projects/

ต่อไป ให้สร้างตัวแปรใหม่ชื่อ TEST_VARIABLE บนบรรทัดคำสั่ง และเมื่อ echo ค่าควรจะว่างเปล่า:

$ echo $TEST_VARIABLE

ตอนนี้เราจะสร้างไฟล์ .envrc ใหม่ที่มีโค้ด Bash ที่จะถูกโหลดโดย direnv เรายังลองเพิ่มบรรทัด "export the TEST_VARIABLE=tecmint" ลงไปด้วยคำสั่ง echo และตัวดำเนินการเปลี่ยนทิศทางเอาต์พุต (>):

$ echo export TEST_VARIABLE=tecmint > .envrc

โดยค่าเริ่มต้น กลไกความปลอดภัยจะบล็อกการโหลดไฟล์ .envrc เนื่องจากเรารู้ว่ามันเป็นไฟล์ที่ปลอดภัย เราจึงต้องอนุมัติเนื้อหาของมันโดยรันคำสั่งต่อไปนี้:

$ direnv allow .

ตอนนี้เนื้อหาของไฟล์ .envrc ได้รับอนุญาตให้โหลดแล้ว ให้ตรวจสอบค่าของ TEST_VARIABLE ที่เราตั้งไว้ก่อนหน้านี้:

$ echo $TEST_VARIABLE

เมื่อเราออกจากไดเรกทอรี tecmint_project direnv จะถูกยกเลิกการโหลด และถ้าเราตรวจสอบค่า TEST_VARIABLE อีกครั้ง ควรจะว่างเปล่า:

$ cd ..
$ echo $TEST_VARIABLE

ทุกครั้งที่คุณเข้าไปในไดเรกทอรี tecmint_projects ไฟล์ .envrc จะถูกโหลดตามที่แสดงในภาพหน้าจอต่อไปนี้:

$ cd tecmint_projects/

เพื่อเพิกถอนการอนุญาตของ .envrc ที่กำหนด ให้ใช้คำสั่ง deny

$ direnv deny . #ในไดเรกทอรีปัจจุบัน หรือ
$ direnv deny /path/to/.envrc

สำหรับข้อมูลเพิ่มเติมและคำแนะนำการใช้งาน โปรดดูหน้าคู่มือ direnv:

$ man direnv

นอกจากนี้ direnv ยังใช้ stdlib (direnv-stdlib) ที่มาพร้อมกับฟังก์ชันหลายอย่างซึ่งช่วยให้คุณเพิ่มไดเรกทอรีใหม่เข้าไปใน PATH ของคุณได้อย่างง่ายดาย และทำอะไรได้อีกมากมาย

เพื่อหาเอกสารสำหรับฟังก์ชันที่มีอยู่ทั้งหมด โปรดตรวจสอบหน้าคู่มือ direnv-stdlib:

$ man direnv-stdlib

ขอจบเพียงเท่านี้ หากคุณมีคำถามหรือความคิดเห็นที่ต้องการแบ่งปัน โปรดใช้แบบฟอร์มความคิดเห็นด้านล่าง