2016-12-10 22 views
8

Tôi muốn sử dụng yarn install thay vì npm install. Tôi muốn tăng lỗi trong npm install. Tôi nên làm gì trong số package.json?Cài đặt sợi Force thay vì cài đặt npm cho module Node?

+0

lỗi gì bạn đang phải đối mặt với ** NPM cài đặt * * –

+0

Nó có thể không phải là một lỗi mà anh ta phải đối mặt, nhưng đúng hơn là mong muốn đảm bảo toàn bộ đội của anh ta đang sử dụng sợi. Sợi sửa chữa rất nhiều vấn đề gây ra bởi npm khi làm việc trên một nhóm. –

Trả lời

11

Trong kịch bản cài đặt sẵn, bạn có thể chạy một kịch bản nút nhỏ mà nên làm việc trên tất cả các nền tảng, trong khi những thứ như pgrep (và phổ biến lệnh * nix khác và các nhà khai thác) sẽ không hoạt động trên Windows cho đến khi Windows 10 nhận được sự chấp nhận rộng rãi.

Tôi đã thử nghiệm tập lệnh bên dưới trên Node v4.7.0 (npm v2.15.11) và Node v7.2.1 (npm v3.10.10). Tôi cho rằng nó hoạt động trên mọi thứ ở giữa. Nó hoạt động bằng cách kiểm tra các biến môi trường trên quy trình hiện đang chạy - npm_execpath là đường dẫn đến tập lệnh "npm" hiện đang chạy. Trong trường hợp sợi, nó nên trỏ đến /path/to/yarn/on/your/machine/yarn.js.

"scripts": { 
    "preinstall": "node -e \"if(process.env.npm_execpath.indexOf('yarn') === -1) throw new Error('You must use Yarn to install, not NPM')\"" 
} 

LƯU Ý: Update từ Alexander's answer - điều này sẽ không hoạt động nếu người dùng sử dụng
npm install --ignore-scripts. Vui lòng cung cấp tín dụng khi tín dụng đến hạn.

Bạn có thể đọc thêm về các kịch bản NPM đây: https://docs.npmjs.com/misc/scripts

Theo như biến npm_execpath môi trường, trong khi không ghi nhận tôi nghi ngờ rằng nó sẽ không bao giờ thay đổi. Đó là xung quanh cho nhiều bản phát hành chính của npm và nó không thực sự vượt qua "có tên tốt hơn cho thử nghiệm" này.

+0

&& là tốt trong các tập lệnh npm vì chúng được thực hiện bằng dấu nhắc lệnh, chứ không phải quyền hạn. – cchamberlain

+0

Ah, cảm ơn. Tôi nghĩ rằng Windows tương đương với '&&' là '&' - tôi đã nhầm lẫn ('&' là cửa sổ tương đương với ';'). Tôi đã cập nhật câu trả lời của mình. –

+0

Các trích dẫn quan trọng trên cửa sổ và sẽ đưa ra lỗi nếu bạn sử dụng dấu nháy đơn cho đối số -e: '" preinstall ":" node -e \ "if (process.env.npm_execpath.indexOf ('yarn') == = -1) ném lỗi mới ('Bạn phải sử dụng Sợi để cài đặt, không phải NPM') \ "" ' – Thomas

1

Bạn có thể sử dụng móc preinstall cùng với một số tập lệnh shell để đạt được điều này.

mẫu package.json:

"scripts": { 
    "preinstall": "pgrep npm && exit 1" 
    } 
+0

Điều này không hiệu quả đối với tôi trên OSX vì nó tạo ra các kết quả dương tính giả. Ví dụ, chạy 'pgrep npm' trực tiếp trong Terminal trả về một ID tiến trình vì tôi tình cờ có một máy chủ đang chạy được bắt đầu bằng một tập lệnh npm. –

2

Giống như các câu trả lời khác, tôi khuyên bạn nên sử dụng một số preinstall script và kiểm tra môi trường của bạn. Đối với một giải pháp di động mà sẽ không có dương tính giả nếu một quá trình npm xảy ra để được chạy, sử dụng node -e 'JS_CODE' có lẽ là lựa chọn tốt nhất.

Trong đó mã JS, bạn có thể kiểm tra con đường quản lý gói bằng cách sử dụng như sau: nhị phân

process.env.npm_execpath 

Sợi là yarn.js, so với npm-cli.js sử dụng bởi NPM. Chúng tôi có thể sử dụng regex như sau để kiểm tra xem chuỗi này có kết thúc bằng yarn.js hay không.

/yarn\.js$/ 

Bằng cách sử dụng regex này, chúng tôi có thể chắc chắn nó sẽ không vô tình khớp ở đâu đó trước đó trong hệ thống tệp. Nhiều khả năng yarn sẽ không xuất hiện trong đường dẫn tệp, nhưng bạn không bao giờ có thể quá chắc chắn.

Dưới đây là một ví dụ nhỏ:

{ 
    "name": "test", 
    "version": "1.0.0", 
    "scripts": { 
    "preinstall": "node -e 'if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error(\"Use yarn\")'" 
    } 
} 

Tất nhiên, người dùng sẽ vẫn có thể nhận được xung quanh việc kiểm tra này được chỉnh sửa JSON hoặc sử dụng --ignore-scripts lựa chọn:

npm install --ignore-scripts 
1

Tôi đã vừa phát hành một mô-đun bao gồm CLI cho điều này (hữu ích cho npm preinstall tập lệnh): https://github.com/adjohnson916/use-yarn

Ngoài ra, tôi vừa phát hành mỗi cho Danger để kiểm tra thiếu yarn.lock thay đổi nào trên CI: https://github.com/adjohnson916/danger-yarn-lock

Xem thêm thảo luận ở đây:

Các vấn đề liên quan