Hooks
Theo mặc định, Volta tải Node, npm và Yarn từ các nguồn và registry công khai (https://nodejs.org, https://yarnpkg.com, https://www.npmjs.com). Tuy nhiên, tùy thuộc vào môi trường của bạn, bạn có thể cần yêu cầu Volta tải từ một nguồn khác (ví dụ: npm Enterprise cho các công cụ nội bộ). Để hỗ trợ điều đó, Volta cung cấp hooks vào quá trình tải.
Chỉ định hooks ở đâu
Hooks luôn được đặt trong một file tên là hooks.json. File này có thể nằm ở một trong hai vị trí, tùy thuộc vào phạm vi bạn muốn các hooks đó có hiệu lực:
- Hooks được chỉ định trong thư mục Volta (
~/.volta/hooks.jsontrên Linux/MacOS,%LOCALAPPDATA%\Volta\hooks.jsontrên Windows) sẽ áp dụng trên toàn bộ hệ thống. - Hooks được chỉ định trong thư mục con
.voltacủa một dự án (<PROJECT ROOT>/.volta/hooks.json) sẽ chỉ áp dụng trong dự án đó.<PROJECT ROOT>ở đây được định nghĩa là vị trí củapackage.jsoncho dự án đó.
Định dạng file Hooks
Nội dung của hooks.json phải là một object, với các key tùy chọn cho mỗi loại công cụ (hiện tại là node, npm và yarn). Mỗi công cụ có 3 hành động có thể áp dụng hook cho mỗi hành động:
indexĐại diện cho URL được sử dụng để xác định danh sách các phiên bản có sẵn để tải cho công cụ đó. Phản hồi khi truy cập URL đó phải khớp với định dạng của các index công khai cho công cụ đã chọn.latestĐại diện cho URL được sử dụng để xác định phiên bản mới nhất của công cụ đó. Đối vớinode, phản hồi nên có cùng định dạng nhưindex, đảm bảo rằng phiên bản mới nhất là phần tử đầu tiên trong danh sách. Đối vớiyarn, phản hồi nên là chuỗi số phiên bản thô và không có gì khác.distroĐại diện cho URL được sử dụng để tải các binary của công cụ.
Cuối cùng, mỗi hành động có 3 hooks khả dĩ (được mô tả bên dưới) có thể được sử dụng (chỉ một trong số đó có thể được chỉ định cho mỗi hành động tại bất kỳ thời điểm nào). Một file hooks.json ví dụ như sau:
{
"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"
}
}
}Các loại Hook
Hook prefix
Hook prefix là một sự thay thế URL đơn giản. URL sẽ được xây dựng bằng cách sử dụng prefix được chỉ định, theo sau là tên file công khai cho hành động đó. Ví dụ, sử dụng hooks.json ở trên, chúng ta có một hook prefix được chỉ định để xác định phiên bản yarn mới nhất. Theo mặc định, Volta sẽ tải phiên bản mới nhất bằng cách gửi yêu cầu đến https://yarnpkg.com/latest-version. Sử dụng hook, Volta sẽ thay vì truy cập http://example.com/yarnpkg/latest-version, thêm latest-version vào prefix được chỉ định là http://example.com/yarnpkg/.
Hook template
Hook template cho phép bạn chỉ định template cho một URL, với các wildcard sẽ được thay thế. Các wildcard khả dĩ là:
sẽ được thay thế bằngdarwin,linuxhoặcwin, tùy thuộc vào hệ điều hành.sẽ được thay thế bằngx86hoặcx64, tùy thuộc vào kiến trúc của hệ thống.(Chỉ khả dĩ cho các hành độngdistro) sẽ được thay thế bằng phiên bản cụ thể của công cụ mà Volta đang cố tải.sẽ được thay thế bằng tên của file mà Volta sẽ tải từ registry công khai.(Chỉ khả dĩ cho các hành độngdistro) sẽ được thay thế bằng phần mở rộng file mà Volta mong đợi tải.
TIP
Các thay thế filename và ext chỉ khả dĩ trong Volta 0.8.4 hoặc mới hơn
Sử dụng hook node.distro từ ví dụ ở trên, khi tải node@10.15.3 trên hệ thống Linux 64-bit, Volta sẽ cố tải tarball từ: http://example.com/linux/x64/node-10.15.3.tar.gz
Hook bin
Hook bin là một hook đa năng sẽ gọi đến một script bên ngoài để xác định URL. Giá trị là một đường dẫn đến một script thực thi sẽ được gọi, và URL sẽ được đọc từ stdout của script đó. stderr của script sẽ được hiển thị cho người dùng, vì vậy nó có thể được sử dụng để hiển thị thanh tiến trình hoặc vòng chờ nếu muốn. Nếu đường dẫn đến script là tương đối thì nó sẽ được phân giải tương đối so với file hooks.json mà nó được chỉ định. Trong ngữ cảnh này, một đường dẫn tương đối có nghĩa là đường dẫn bắt đầu bằng ./ hoặc ../ trên Linux/MacOS và bắt đầu bằng .\ hoặc ..\ trên Windows. Cuối cùng, đối với các hook hành động distro, phiên bản được yêu cầu của công cụ sẽ được truyền làm đối số đầu tiên cho script đó.
Sử dụng hook yarn.distro từ ví dụ hooks.json, khi tải yarn@1.13.0, Volta sẽ gọi ~/yarn-distro "1.13.0" và cố tải tarball từ URL được trả về bởi hook đó.