npm: vô hiệu hóa tập lệnh postinstall cho gói


142

Có bất kỳ tùy chọn npm tồn tại để vô hiệu hóa tập lệnh cài đặt trong khi cài đặt gói không? Hoặc để viết lại bất kỳ trường nào từ pack.json?


Câu hỏi đặt ra là rất rõ ràng nhưng ... là bởi bất kỳ cơ hội này mục tiêu cuối cùng của bạn? github.com/zloirock/core-js#postinstall-message ;-)
Conny

Câu trả lời:


267

Không thể chỉ vô hiệu hóa postinstallcác tập lệnh. Tuy nhiên, bạn có thể vô hiệu hóa tất cả các tập lệnh bằng cách sử dụng:

$ npm install --ignore-scripts

Như delbertooo đã đề cập trong các bình luận, điều này cũng vô hiệu hóa các tập lệnh của các phụ thuộc.


2
Cám ơn. Đây chính xác là những gì tôi cần. Tôi có thể tìm thấy những lựa chọn như vậy ở đâu? Điều này không được mô tả trong 'npm help install', 'npm help config' và 'npm help scripts'.
farwayer

3
Tôi đã kiểm tra mã trực tiếp: github.com/npm/npm/blob/master/lib/build.js#L179
Gergo Erdosi

69
Chú ý! Tùy chọn --ignore-scriptsvô hiệu hóa TẤT CẢ các tập lệnh - ngay cả từ các phụ thuộc của bạn. Nếu phụ thuộc của bạn cần chạy tập lệnh để cài đặt một số nhị phân, chúng có thể bị hỏng / không đầy đủ.
delbertooo

7
Vì vậy, có một kỹ thuật sau đó để cài đặt node_modules (và tất cả các tập lệnh của chúng) mà chỉ bỏ qua các tập lệnh của gói chính?
Derrick

3
Không chỉ điều này, mà --ignore-scripts, hoặc tùy chọn cấu hình được liên kết (mà tôi đặt trên toàn cầu) cũng có nghĩa là npm run startsẽ âm thầm không làm gì và báo cáo thành công. Kinh ngạc.
Ash Berlin-Taylor

21

Bạn cũng có thể kích hoạt các cài đặt trong tệp cấu hình npm.

npm config set ignore-scripts true

Lưu ý: Điều này sẽ vô hiệu hóa tập lệnh cho tất cả các gói NPM.


2
Đây nên là câu trả lời. Xem bài đăng trên blog của npm
Pieter Venter

4

Để làm điều này cho thư viện của riêng bạn, tôi khuyên bạn nên một cái gì đó đơn giản như:

#!/usr/bin/env bash

## this is your postinstall.sh script:

set -e;

if [ "$your_pkg_skip_postinstall" == "yes" ]; then
  echo "skipping your package's postinstall routine.";
  exit 0;
fi

sau đó thực hiện cài đặt npm của bạn với:

your_pkg_skip_postinstall="yes" npm install

1
Cảm ơn! Điều này hoạt động rất tốt nếu bạn chỉ đang cố gắng vô hiệu hóa tập lệnh của riêng mình chứ không phải TẤT CẢ các tập lệnh trong tất cả các phụ thuộc.
Brian Neisler

@BrianNeisler yer rất hoan nghênh, luôn cảm thấy tốt khi giúp đỡ người khác. Nhân tiện, tôi nghĩ rằng dấu ngoặc kép [[]] có thể tốt hơn dấu ngoặc đơn cho hầu hết các trường hợp sử dụng, không chắc chắn tho.
Alexander Mills

2

Tôi muốn vô hiệu hóa tập lệnh postinstall cho dự án của mình nhưng muốn tất cả các tập lệnh phụ thuộc dự án của tôi chạy khi tôi làm npm install. Đây là những gì tôi đã làm.

  1. Tạo một kịch bản ./scripts/skip.js
if (process.env.SKIP_BUILD) {
    process.exit(0);
} else {
    process.exit(1);
}
  1. Trong tệp pack.json của bạn
 "scripts": {
  ...
  "postinstall": "node ./scripts/skip.js || npm run build",
  ...
 }

bây giờ chỉ cần đặt biến môi trường SKIP_BUILD = 1 để ngăn gói của bạn xây dựng và các phụ thuộc của bạn sẽ xây dựng tốt

SKIP_BUILD=1 npm install
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.