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

setV: เครื่องมือ Bash ที่มีประสิทธิภาพสำหรับการจัดการสภาพแวดล้อมเสมือนของ Python

บทนำ

มากกว่าหนึ่งปีที่ผ่านมา setV ได้ถูกเก็บไว้ภายในโครงการ bash_scripts ของผม แต่วันนี้ก็ถึงเวลาที่จะเปิดเผยสู่สาธารณะ setV เป็นฟังก์ชัน Bash ที่ผมใช้เป็นทางเลือกแทน virtualenvwrapper มันให้คุณสมบัติพื้นฐานที่ช่วยให้คุณทำสิ่งต่างๆ ได้ดังนี้:

  • ใช้ Python 3 เป็นค่าเริ่มต้น
  • สร้างสภาพแวดล้อมเสมือนใหม่
  • สร้างสภาพแวดล้อมเสมือนใหม่โดยใช้เส้นทาง Python แบบกำหนดเองด้วย -p (หรือ --python)
  • ลบสภาพแวดล้อมเสมือนที่มีอยู่
  • แสดงรายการสภาพแวดล้อมเสมือนทั้งหมด
  • ใช้การเสร็จสมบูรณ์ของ Tab (ในกรณีที่คุณไม่จำชื่อสภาพแวดล้อมเสมือน)

การติดตั้ง

เพื่อติดตั้ง setV ให้ดาวน์โหลดสคริปต์:

curl https://gitlab.com/psachin/setV/raw/master/install.sh

ตรวจสอบสคริปต์ แล้วรันมัน:

sh ./install.sh

เมื่อคุณติดตั้ง setV สคริปต์การติดตั้งจะขอให้คุณ source ~/.bashrc หรือ ~/.bash_profile โปรดทำตามขั้นตอนนี้

การใช้งาน

คำสั่งพื้นฐานคือ setv

สร้างสภาพแวดล้อมเสมือน:

setv --new rango # setv -n rango

# หรือใช้เส้นทางไบนารี Python แบบกำหนดเอง
setv --new --python /opt/python/python3 rango # setv -n -p /opt/python/python3 rango

เปิดใช้งานสภาพแวดล้อมที่มีอยู่:

setv VIRTUAL_ENVIRONMENT_NAME

# ตัวอย่าง
setv rango

แสดงรายการสภาพแวดล้อมเสมือนทั้งหมด:

setv --list
# หรือ
setv [TAB] [TAB]

ลบสภาพแวดล้อมเสมือน:

setv --delete rango

สลับไปยังสภาพแวดล้อมเสมือนอื่น:

# สมมติว่าคุณอยู่ใน 'rango' ให้สลับไป 'tango' โดยใช้
setv tango

การเสร็จสมบูรณ์ของ Tab

หากคุณไม่จำชื่อสภาพแวดล้อมเสมือนเต็มๆ การเสร็จสมบูรณ์ของ Tab แบบ Bash จะทำงานสำหรับชื่อสภาพแวดล้อมเสมือน

ร่วมพัฒนา

setV เป็นโอเพนซอร์สภายใต้ GNU GPLv3 และยินดีต้อนรับการมีส่วนร่วม ในการเรียนรู้เพิ่มเติม โปรดไปที่ส่วน Contribute ของ README ของ setV ในที่เก็บ GitLab

สคริปต์ setV

#!/usr/bin/env bash
# setV - ตัวจัดการสภาพแวดล้อมเสมือน Python แบบเบาเวท
# ผู้เขียน: Sachin (psachin) <iclcoolster@gmail.com>
# URL ผู้เขียน: https://psachin.gitlab.io/about
#
# สัญญาอนุญาต: GNU GPL v3 ดูไฟล์ LICENSE
#
# การกำหนดค่า (ทางเลือก):
# ตั้งค่า `SETV_VIRTUAL_DIR_PATH` เป็นเส้นทางไดเรกทอรีสภาพแวดล้อมเสมือน
# โดยค่าเริ่มต้นคือ '~/virtualenvs/'
#
# การใช้งาน:
# ติดตั้งด้วยตนเอง: เพิ่มบรรทัดด้านล่างลงใน .bashrc หรือสคริปต์ rc ท้องถิ่นใดๆ:
# ---
# source /path/to/virtual.sh
# ---
#
# ตอนนี้คุณสามารถ 'เปิดใช้งาน' สภาพแวดล้อมเสมือนได้โดยการพิมพ์
# $ setv <ชื่อสภาพแวดล้อมเสมือนของคุณ>
#
# ตัวอย่าง:
# $ setv rango
#
# หรือพิมพ์:
# setv [TAB] [TAB] (เพื่อแสดงรายการสภาพแวดล้อมเสมือนทั้งหมด)
#
# เพื่อแสดงรายการสภาพแวดล้อมเสมือนทั้งหมดของคุณ:
# $ setv --list
#
# เพื่อสร้างสภาพแวดล้อมเสมือนใหม่:
# $ setv --new new_virtualenv_name
#
# เพื่อลบสภาพแวดล้อมเสมือนที่มีอยู่:
# $ setv --delete existing_virtualenv_name
#
# เพื่อยกเลิกการเปิดใช้งาน ให้พิมพ์:
# $ deactivate

# เส้นทางไปยังไดเรกทอรีสภาพแวดล้อมเสมือน
SETV_VIRTUAL_DIR_PATH="$HOME/virtualenvs/"
# เวอร์ชัน Python เริ่มต้นที่จะใช้ ซึ่งจะตัดสินใจว่าจะใช้ `virtualenv` หรือ `python3 -m venv`
SETV_PYTHON_VERSION=3 # ค่าเริ่มต้นคือ Python3
SETV_PY_PATH=$(which python${SETV_PYTHON_VERSION})

function _setvcomplete_()
{
# การเสร็จสมบูรณ์อัตโนมัติของ Bash
# ทำให้การเสร็จสมบูรณ์ของ Tab ทำงานสำหรับชื่อสภาพแวดล้อมเสมือน
local cmd="${1##*/}" # เพื่อจัดการคำสั่ง

local word=${COMP_WORDS[COMP_CWORD]} # คำที่กำลังเสร็จสมบูรณ์
local xpat='${word}' # รูปแบบตัวกรอง รวมเฉพาะคำในตัวแปร '$names'
local names=$(ls -l "${SETV_VIRTUAL_DIR_PATH}" | egrep '^d' | awk -F " " '{print $NF}') # ชื่อสภาพแวดล้อมเสมือน

COMPREPLY=($(compgen -W "$names" -X "$xpat" -- "$word")) # compgen สร้างผลลัพธ์
}

function _setv_help_() {
# แสดงข้อความช่วยเหลือ/การใช้งาน
echo "การใช้งาน: setv [ตัวเลือก] [ชื่อ]"
echo "อาร์กิวเมนต์ตำแหน่ง:"
echo -e "ชื่อ เปิดใช้งานสภาพแวดล้อมเสมือน"
echo "อาร์กิวเมนต์ทางเลือก:"
echo -e "-l, --list แสดงรายการสภาพแวดล้อมเสมือนทั้งหมด"
echo -e "-n, --new ชื่อ สร้างสภาพแวดล้อมเสมือน Python ใหม่"
echo -e "-d, --delete ชื่อ ลบสภาพแวดล้อมเสมือน Python ที่มีอยู่"
echo -e "-p, --python เส้นทาง เส้นทางไบนารี Python"
}

function _setv_custom_python_path()
{
if [ -f "${1}" ];
then
if [ "`expr $1 : '.*python\([2,3]\)'`" = "3" ];
then
SETV_PYTHON_VERSION=3
else
SETV_PYTHON_VERSION=2
fi
SETV_PY_PATH=${1}
_setv_create $2
else
echo "ข้อผิดพลาด: เส้นทาง ${1} ไม่มีอยู่!"
fi
}

function _setv_create()
{
# สร้างสภาพแวดล้อมเสมือนใหม่หากรันด้วยแฟล็ก -n|--new
if [ -z ${1} ];
then
echo "คุณต้องระบุชื่อสภาพแวดล้อมเสมือน"
_setv_help_
else
echo "กำลังสร้างสภาพแวดล้อมเสมือนใหม่ชื่อ: $1"

if [ ${SETV_PYTHON_VERSION} -eq 3 ];
then
${SETV_PY_PATH} -m venv ${SETV_VIRTUAL_DIR_PATH}${1}
else
virtualenv -p ${SETV_PY_PATH} ${SETV_VIRTUAL_DIR_PATH}${1}
fi

echo "คุณสามารถเปิดใช้งานสภาพแวดล้อมเสมือน Python ได้โดยการพิมพ์: setv ${1}"
fi
}

function _setv_delete()
{
# ลบสภาพแวดล้อมเสมือนหากรันด้วยแฟล็ก -d|--delete
# TODO: Refactor
if [ -z ${1} ];
then
echo "คุณต้องระบุชื่อสภาพแวดล้อมเสมือน"
_setv_help_
else
if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ];
then
read -p "ลบสภาพแวดล้อมเสมือนนี้จริงๆ หรือไม่ (Y/N)? " yes_no
case $yes_no in
Y|y) rm -rvf ${SETV_VIRTUAL_DIR_PATH}${1};;
N|n) echo "เก็บสภาพแวดล้อมเสมือนไว้ตามเดิม.";;
*) echo "คุณต้องป้อน Y/y หรือ N/n"
esac
else
echo "ข้อผิดพลาด: ไม่พบสภาพแวดล้อมเสมือนชื่อ: ${1}"
fi
fi
}

function _setv_list()
{
# แสดงรายการสภาพแวดล้อมเสมือนทั้งหมดหากรันด้วยแฟล็ก -l|--list
echo -e "รายการสภาพแวดล้อมเสมือนที่คุณมีอยู่ภายใต้ ${SETV_VIRTUAL_DIR_PATH}:\n"
for virt in $(ls -l "${SETV_VIRTUAL_DIR_PATH}" | egrep '^d' | awk -F " " '{print $NF}')
do
echo ${virt}
done
}

function setv() {
# ฟังก์ชันหลัก
if [ $# -eq 0 ];
then
_setv_help_
elif [ $# -le 3 ];
then
case "${1}" in
-n|--new) _setv_create ${2};;
-d|--delete) _setv_delete ${2};;
-l|--list) _setv_list;;
*) if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ];
then
# เปิดใช้งานสภาพแวดล้อมเสมือน
source ${SETV_VIRTUAL_DIR_PATH}${1}/bin/activate
else
# แสดงข้อความข้อผิดพลาด
echo "ขออภัย คุณไม่มีสภาพแวดล้อมเสมือนชื่อ: ${1}"
_setv_help_
fi
;;
esac
elif [ $# -le 5 ];
then
case "${2}" in
-p|--python) _setv_custom_python_path ${3} ${4};;
*) _setv_help_;;
esac
fi
}

# เรียก bash-complete คำสั่ง compgen ยอมรับตัวเลือกส่วนใหญ่เหมือนกับ complete
# แต่จะสร้างผลลัพธ์แทนที่จะเก็บกฎสำหรับการใช้งานในอนาคต
complete -F _setvcomplete_ setv