มอบทางเลือกที่ปลอดภัยกว่าให้กับ composer global require
Cgr ถูกนำมาใช้ในสภาพแวดล้อมจริงมาหลายปีแล้ว อย่างไรก็ตาม โปรดดูคิวปัญหาและ 'ข้อจำกัด' ด้านล่าง
คำสั่ง Composer global require
เป็นเทคนิคการติดตั้งที่แนะนำสำหรับเครื่องมือ commandline PHP จำนวนมาก อย่างไรก็ตาม ผู้ใช้ที่ติดตั้งเครื่องมือด้วยวิธีนี้อาจเสี่ยงต่อความล้มเหลวในการติดตั้งที่เกิดจากข้อขัดแย้งในการพึ่งพาระหว่างโปรเจ็กต์ต่างๆ สคริปต์ cgr ทำงานคล้ายกับ composer global require
โดยใช้ composer require
เพื่อติดตั้งสำเนาเครื่องมือ commandline ทั่วโลกต่อผู้ใช้ แต่อยู่ในตำแหน่งแยกที่จะไม่พบข้อขัดแย้งในการพึ่งพากับเครื่องมืออื่นๆ ที่ติดตั้งทั่วโลก
สคริปต์ cgr ไม่เกี่ยวข้องกับความปลอดภัย มันไม่มากไปกว่านั้นหรือปลอดภัยน้อยกว่าการติดตั้งผ่าน composer global need
ผู้แต่งเองแนะนำให้ composer global require
เป็นคำสั่ง "สะดวก" สำหรับการติดตั้งเครื่องมือบรรทัดคำสั่ง น่าเสียดายที่คำแนะนำนี้ขัดแย้งกับสมมติฐานพื้นฐานของ Composer ซึ่งหมายความว่าการขึ้นต่อกันของทุกโปรเจ็กต์ควรได้รับการจัดการอย่างเป็นอิสระ คำสั่ง global
ของ Composer สร้างโปรเจ็กต์ "สากล" เดียว โปรเจ็กต์ที่ติดตั้งผ่าน composer global require
ทั้งหมดจะถูกติดตั้งในตำแหน่งนี้ และการขึ้นต่อกันทั้งหมดจะถูกรวมเข้าด้วยกัน ซึ่งหมายความว่าข้อขัดแย้งอาจเกิดขึ้นระหว่างสองโปรเจ็กต์อิสระที่ไม่เคยได้รับการออกแบบให้ทำงานร่วมกัน และไม่จำเป็นต้องรวมการพึ่งพาเข้าด้วยกันในตัวโหลดอัตโนมัติตัวเดียว เมื่อเกิดสถานการณ์เช่นนี้ ผู้เริ่มต้นมักจะวินิจฉัยได้ยาก
สคริปต์นี้เรียกว่า cgr
ตั้งชื่อตาม "composer global need" ซึ่งเป็นคำสั่ง Composer ที่สคริปต์จำลอง มีกลไกทดแทนสำหรับการติดตั้งเครื่องมือบรรทัดคำสั่ง PHP ทั่วโลกซึ่งมีฟังก์ชันเทียบเท่า (เกือบ) กับคำสั่งที่มีอยู่ แต่ปลอดภัยกว่ามาก สคริปต์ Cgr จะสร้างไดเรกทอรีแยกต่างหากสำหรับแต่ละโครงการที่ติดตั้ง โดยค่าเริ่มต้น ตำแหน่งการติดตั้งคือ ~/.composer/global/org/project
สคริปต์ไบนารี่ใดๆ ที่อยู่ในไฟล์ composer.json ของโปรเจ็กต์ที่ติดตั้งจะถูกติดตั้งลงในไดเร็กทอรี Composer bin มาตรฐาน ~/.composer/vendor/bin
เนื่องจากสคริปต์ cgr ไม่มีการพึ่งพาของตัวเอง จึงปลอดภัยที่จะติดตั้งผ่านคำสั่ง Composer global require
:
composer global require consolidation/cgr
หากคุณยังไม่ได้ดำเนินการ คุณจะต้องเพิ่ม vendor/bin
จากโฮมไดเร็กตอรี่ของ Composer ไปยัง $PATH ของคุณ หลังจากนั้น คุณอาจทดแทน cgr
สำหรับเครื่องมือ commandline ใดๆ ที่มีคำแนะนำในการติดตั้งแนะนำให้ใช้ Composer global require
หากต้องการเพิ่มไดเร็กทอรี bin ที่ถูกต้องให้กับ PATH ของคุณ:
PATH="$(composer config -g home)/vendor/bin:$PATH"
ตัวอย่าง:
cgr drush/drush
ต่างจากคำสั่ง need ของผู้แต่งทั่วโลก คุณสามารถใช้ cgr เพื่อตั้งค่าความเสถียรขั้นต่ำสำหรับโปรเจ็กต์ก่อนทำการติดตั้ง สิ่งนี้ทำในลักษณะเดียวกับคำสั่ง composer create-project
:
cgr --stability RC pantheon-systems/terminus 1.0.0-alpha2
ลักษณะการทำงานของสคริปต์ cgr สามารถปรับแต่งได้ด้วยตัวเลือกบรรทัดคำสั่งและตัวแปรสภาพแวดล้อม
ตัวเลือก | ตัวแปรสภาพแวดล้อม | คำอธิบาย |
---|---|---|
--ผู้แต่งเส้นทาง | CGR_COMPOSER_PATH | เส้นทางสู่ไบนารีของ Composer |
--base-dir | CGR_BASE_DIR | จะจัดเก็บโครงการ "ระดับโลก" ได้ที่ไหน |
--bin-dir | CGR_BIN_DIR | จะติดตั้งไบนารีโครงการได้ที่ไหน |
หากไม่ได้กำหนดตัวแปรเหล่านี้ cgr จะใช้ค่าของตัวแปรสภาพแวดล้อม COMPOSER_HOME
เป็นไดเร็กทอรีฐานเพื่อใช้ตามที่อธิบายไว้ในเอกสารประกอบของ Composer เกี่ยวกับตัวแปรสภาพแวดล้อม
หากต้องการกำหนดค่า cgr ให้ติดตั้งไบนารีไปที่ ~/bin ให้เพิ่มสิ่งต่อไปนี้ในไฟล์ ~/.bashrc ของคุณ:
export CGR_BIN_DIR=$HOME/bin
คุณสามารถเลือกไดเร็กทอรีใดก็ได้ที่คุณต้องการสำหรับ CGR_BIN_DIR
ตราบใดที่อยู่ใน $PATH ของคุณ
หากต้องการแสดงข้อมูลของโครงการ ให้รัน:
cgr info drush/drush
หากต้องการแสดงข้อมูลของโครงการทั้งหมดที่ติดตั้งผ่าน 'cgr' ให้รัน:
cgr info
หากต้องการอัพเดตโปรเจ็กต์ที่คุณติดตั้งด้วย cgr
ให้รัน:
cgr update drush/drush
หากต้องการอัปเดตทุกสิ่งที่ติดตั้งโดย cgr
ให้รัน:
cgr update
หากต้องการลบโปรเจ็กต์:
cgr remove drush/drush
หากต้องการอัปเดตหรือลบ cgr ให้รัน composer global update consolidation/cgr
หรือ composer global remove cgr
โปรดทราบว่าการลบ cgr จะไม่มีผลกับคำสั่งที่คุณติดตั้งด้วย cgr พวกเขาจะยังคงติดตั้งและใช้งานได้
หากคุณพบว่า cgr
ยังคงทำงานเหมือนกับคำสั่ง global require
ของ Composer ให้ตรวจสอบการตั้งค่าตัวแปร $PATH ของคุณอีกครั้ง และใช้ which cgr
และ alias cgr
ใดเพื่อพิจารณาว่าสคริปต์นี้ถูกเลือกโดยเชลล์ของคุณหรือไม่ เป็นไปได้ว่า cgr อาจขัดแย้งกับเครื่องมืออื่น ตัวอย่างเช่น โปรเจ็กต์ oh-my-zsh กำหนดนามแฝง cgr หากนี่เป็นปัญหาสำหรับคุณ ทั้ง unalias cgr
หรืออาจเพิ่ม alias cgrx="$HOME/.composer/vendor/bin/cgr"
เพื่อเรียกใช้เครื่องมือทดลองนี้เป็น cgrx
Composer จะโหลด Composer Plugins จากโปรเจ็กต์ Composer "สากล" ด้วย นี่เป็นของหายาก อย่างไรก็ตาม หากคุณต้องการติดตั้ง Composer Installer ทั่วโลก คุณต้องใช้คำสั่ง composer global require
โดยตรง สคริปต์ cgr แยกโปรเจ็กต์ที่ติดตั้งออกจากกัน เพื่อหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นระหว่างการขึ้นต่อกัน การแยกนี้ยังทำให้ Composer Plugins ใดๆ ไม่พร้อมใช้งานในบริบทส่วนกลาง
สคริปต์ cgr รักษาความสะดวกในการจัดการตำแหน่งการติดตั้งส่วนกลางสำหรับคุณโดยอัตโนมัติ อย่างไรก็ตาม หากไม่ต้องการ คุณสามารถเรียกใช้คำสั่งที่คล้ายกับ:
COMPOSER_BIN_DIR=$HOME/bin composer require org/project:~1.0
หากคุณใช้เส้นทางนี้ คุณจะต้องตั้งค่าตำแหน่งการติดตั้งด้วยตนเองโดยใช้ mkdir
และ cd
ตามความจำเป็นก่อนที่จะเรียกใช้ composer require
คุณไม่สามารถตั้งค่า COMPOSER_BIN_DIR แบบโกลบอลได้ เนื่องจากการทำเช่นนี้จะทำให้ไบนารีจากโปรเจ็กต์ในเครื่องถูกติดตั้งลงในไดเร็กทอรี bin ส่วนกลางของคุณ ซึ่งแน่นอนว่าไม่เป็นที่พึงปรารถนา
ในสคริปต์การรวมแบบต่อเนื่อง โครงสร้างต่อไปนี้มีประโยชน์:
/usr/bin/env COMPOSER_BIN_DIR=$HOME/bin composer --working-dir=$HOME/project require org/project:~1.0
เปลี่ยนไดเร็กทอรีการติดตั้ง ( $HOME/project
) ให้ตรงกับโปรเจ็กต์ที่กำลังติดตั้ง เพื่อให้ทุกโปรเจ็กต์ได้รับการติดตั้งในตำแหน่งที่แยกจากกัน
ปลั๊กอิน Composer bamarni/composer-bin-plugin นำเสนอวิธีที่คล้ายกันในการจัดการการติดตั้งแบบแยกส่วนของเครื่องมือไบนารีโดยการกำหนดตำแหน่งการติดตั้งที่มีชื่อแยกกัน นี่เป็นวิธีที่สะดวกในการติดตั้งหลายโครงการร่วมกัน (เช่น ติดตั้ง Robo ร่วมกับโครงการภายนอกที่ให้งาน Robo เพิ่มเติมในโครงการ 'robo')
หวังว่าเครื่องมือนี้จะเป็นวิธีแก้ปัญหาชั่วคราว จนกว่าการเปลี่ยนแปลงใน Composer จะทำให้ไม่จำเป็น ดูปัญหาของนักแต่งเพลงสำหรับการอัปเดต