Hooks
โดยค่าเริ่มต้น Volta จะดึง Node, npm และ Yarn จากแหล่งและ registry สาธารณะ (https://nodejs.org, https://yarnpkg.com, https://www.npmjs.com) อย่างไรก็ตาม ขึ้นอยู่กับสภาพแวดล้อมของคุณ อาจจำเป็นต้องบอก Volta ให้ดาวน์โหลดจากแหล่งอื่นแทน (เช่น npm Enterprise สำหรับเครื่องมือภายใน) เพื่อรองรับความต้องการนั้น Volta จึงมี hooks เข้าไปในกระบวนการดาวน์โหลด
ระบุ hooks ที่ไหน
Hooks จะถูกตั้งค่าในไฟล์ที่ชื่อ hooks.json เสมอ ไฟล์นี้สามารถอยู่ในสองตำแหน่ง ขึ้นอยู่กับขอบเขตที่คุณต้องการให้ hooks เหล่านั้นมีผล:
- Hooks ที่ระบุในโฟลเดอร์ Volta (
~/.volta/hooks.jsonบน Linux/MacOS,%LOCALAPPDATA%\Volta\hooks.jsonบน Windows) จะใช้กับทั้งระบบ - Hooks ที่ระบุในโฟลเดอร์ย่อย
.voltaของโปรเจกต์ (<PROJECT ROOT>/.volta/hooks.json) จะใช้เฉพาะภายในโปรเจกต์นั้นเท่านั้น<PROJECT ROOT>ในที่นี้หมายถึงตำแหน่งของpackage.jsonของโปรเจกต์นั้น
รูปแบบไฟล์ Hooks
เนื้อหาของ hooks.json ต้องเป็นออบเจกต์ โดยมีคีย์ที่ไม่บังคับสำหรับเครื่องมือแต่ละประเภท (ปัจจุบันคือ node, npm และ yarn) เครื่องมือแต่ละอย่างมี 3 การกระทำที่สามารถใช้ hook ได้แต่ละอย่าง:
indexแทน URL ที่ใช้กำหนดรายการเวอร์ชันที่สามารถดาวน์โหลดได้สำหรับเครื่องมือเหล่านั้น ผลลัพธ์จากการเข้าถึง URL นั้นต้องตรงกับรูปแบบของดัชนีสาธารณะสำหรับเครื่องมือที่เลือกlatestแทน URL ที่ใช้กำหนดเวอร์ชันล่าสุดของเครื่องมือเหล่านั้น สำหรับnodeผลลัพธ์ควรมีรูปแบบเดียวกับindexโดยตรวจสอบให้แน่ใจว่าเวอร์ชันล่าสุดเป็นองค์ประกอบแรกในรายการ สำหรับyarnผลลัพธ์ควรเป็นสตริงหมายเลขเวอร์ชันดิบๆ เท่านั้นdistroแทน URL ที่ใช้ดาวน์โหลดไบนารีของเครื่องมือ
สุดท้าย แต่ละการกระทำมี 3 hooks ที่เป็นไปได้ (อธิบายด้านล่าง) ที่สามารถใช้ได้ (สามารถระบุได้เพียงหนึ่งเดียวสำหรับการกระทำแต่ละอย่างในเวลาใดก็ตาม) ตัวอย่างไฟล์ hooks.json:
{
"node": {
"index": {
"bin": "/usr/local/node-lookup"
},
"latest": {
"prefix": "http://example.com/node/"
},
"distro": {
"template": "http://example.com/{{os}}/{{arch}}/node-{{version}}.tar.gz"
}
},
"npm": {
"index": {
"prefix": "http://example.com/npm/"
},
"latest": {
"bin": "~/npm-latest"
},
"distro": {
"template": "http://example.com/npm/npm-{{version}}.tgz"
}
},
"yarn": {
"index": {
"template": "http://example.com/yarn/{{os}}/{{arch}}/yarn-{{version}}.tgz"
},
"latest": {
"prefix": "http://example.com/yarnpkg/"
},
"distro": {
"bin": "~/yarn-distro"
}
}
}ประเภท Hook
prefix Hooks
Hook แบบ prefix คือการแทนที่ URL อย่างง่าย URL จะถูกสร้างโดยใช้ prefix ที่ระบุ ตามด้วยชื่อไฟล์สาธารณะสำหรับการกระทำนั้น ตัวอย่างเช่น ใช้ hooks.json ข้างต้น เรามี hook แบบ prefix ที่ระบุสำหรับการกำหนดเวอร์ชัน yarn ล่าสุด โดยค่าเริ่มต้น Volta จะดึงเวอร์ชันล่าสุดโดยการร้องขอไปที่ https://yarnpkg.com/latest-version โดยใช้ hook แทนที่ Volta จะพยายามเข้าถึง http://example.com/yarnpkg/latest-version โดยเติม latest-version ต่อจาก prefix ที่ระบุของ http://example.com/yarnpkg/
template Hooks
Hook แบบ template ช่วยให้คุณสามารถระบุเทมเพลตสำหรับ URL ได้ โดยมี wildcard ที่จะถูกแทนที่ wildcard ที่ใช้ได้มีดังนี้:
จะถูกแทนที่ด้วยdarwin,linuxหรือwinขึ้นอยู่กับระบบปฏิบัติการจะถูกแทนที่ด้วยx86หรือx64ขึ้นอยู่กับสถาปัตยกรรมของระบบ(ใช้ได้เฉพาะการกระทำdistroเท่านั้น) จะถูกแทนที่ด้วยเวอร์ชันเฉพาะของเครื่องมือที่ Volta พยายามดาวน์โหลดจะถูกแทนที่ด้วยชื่อไฟล์ที่ Volta จะดาวน์โหลดจาก registry สาธารณะ(ใช้ได้เฉพาะการกระทำdistroเท่านั้น) จะถูกแทนที่ด้วยส่วนขยายไฟล์ที่ Volta คาดหวังที่จะดาวน์โหลด
TIP
การแทนที่ filename และ ext มีให้ใช้ใน Volta 0.8.4 ขึ้นไปเท่านั้น
ใช้ hook node.distro จากตัวอย่างข้างต้น เมื่อดึง node@10.15.3 บนระบบ Linux 64-bit Volta จะพยายามดาวน์โหลด tarball จาก: http://example.com/linux/x64/node-10.15.3.tar.gz
bin Hooks
Hook แบบ bin คือ hook อเนกประสงค์ที่จะเรียกสคริปต์ภายนอกเพื่อกำหนด URL ค่าคือพาธไปยังสคริปต์ที่เรียกใช้ได้ซึ่งจะถูกเรียก และ URL จะถูกอ่านจาก stdout ของสคริปต์นั้น stderr ของสคริปต์จะแสดงให้ผู้ใช้เห็น ดังนั้นจึงสามารถใช้แสดงแถบความคืบหน้าหรือ spinner รอได้หากต้องการ หากพาธไปยังสคริปต์เป็นพาธสัมพัทธ์ จะถูกแก้ไข relatif กับไฟล์ hooks.json ที่ระบุ ในบริบทนี้ พาธสัมพัทธ์หมายความว่าพาธเริ่มต้นด้วย ./ หรือ ../ บน Linux/MacOS และเริ่มต้นด้วย .\ หรือ ..\ บน Windows สุดท้าย สำหรับ hook การกระทำ distro เวอร์ชันของเครื่องมือที่ร้องขอจะถูกส่งเป็นอาร์กิวเมนต์แรกไปยังสคริปต์นั้น
ใช้ hook yarn.distro จากตัวอย่าง hooks.json เมื่อดึง yarn@1.13.0 Volta จะเรียก ~/yarn-distro "1.13.0" และพยายามดาวน์โหลด tarball จาก URL ที่ส่งคืนโดย hook นั้น