Cách đặt shell cho npm run-scripts trong Windows


82

Tôi đang chạy npm trên Windows và muốn sử dụng & tạo kiểu các hoạt động song song trong run-scripts nhưng chạy song song trong cmd khá lộn xộn trong tệp package.json của tôi, tôi muốn viết-

scripts: { "go": "cmd1 & cmd2"} 

nhưng npm thực thi tập lệnh dưới cmd.exe mà không biết về việc ; tôi có thể thay đổi điều này thành tập lệnh: { "go": "bats/bat1.bat")trong đó bat1.bat là tệp dơi cmd sử dụng lệnh gọi kiểu cửa sổ hoặc lệnh bắt đầu để chạy các lệnh song song. hoạt động nhưng cung cấp cho tôi một tập lệnh chỉ hoạt động trên Windows.

Sẽ đơn giản hơn rất nhiều nếu tôi có thể lấy npm để chạy tập lệnh dưới bản sao bash hoặc cygwin.

Tôi đã thử config: { "shell": "bash"} nhưng vẫn chạy cmd.exe

Có cách nào để yêu cầu npm chạy tập lệnh bằng cách sử dụng một trình bao cụ thể (không phải cmd.exe) không?


Có phải [vẫn] không thể chỉ định một trình bao trong package.json không? Tôi sử dụng npm cho cả windows và bash scripting và không có cách nào ghi đè cài đặt "shell" hoặc "script-shell" mặc định cho một package.json cụ thể?
Corey Alix

Câu trả lời:


153

Kể từ npm 5.1

npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"  

hoặc (cài đặt 64bit)

npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

Lưu ý rằng bạn cần phải cài đặt git cho windows .

Bạn có thể hoàn nguyên nó bằng cách chạy:

npm config delete script-shell

8
Đây phải là câu trả lời được chấp nhận! Hoạt động trên Windows 10 với Git Bash (bao gồm VS Code).
Alex Vang

7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"là câu trả lời cho tất cả các vấn đề của tôi khi chạy các tập lệnh song song trên Windows 10 64-Bit. @DuncanSungWKim 감사 합니다 cho điều này.
TaeKwonJoe

Cảm ơn, tôi đã gặp sự cố với khởi động npm đang hoạt động trong cmd nhưng không hoạt động trong bash và tôi đã chạy tập lệnh bạn đề xuất và nó hoạt động !!!! Sau hai ngày googeling cho một câu trả lời .... -_- Thanks for the help
AlonSamuel

2
Nếu tôi đã ở trong trình bao git bash và chạy npm run <scriptvới cấu hình này, thì một cửa sổ git bash mới sẽ được tạo ra để chạy tập lệnh. Đây không phải là điều tôi muốn. Có cách nào để gọi shell trong shell đang gọi không?
JHH

2
@JHH - Tôi cũng đã mở shell từ vscode vì tôi đang sử dụng git-bash.exe thay vì bash.exe. Khi tôi sửa lỗi vscode bash giống với bash script-shell, sự cố đã được giải quyết.
Corey Alix

28

Đây là một cách để làm điều đó:

  1. Tạo một tập lệnh, chẳng hạn như my_script.sh, trong thư mục bin dự án của bạn.
  2. Trong tệp package.json của bạn, hãy thêm một dòng để chạy tập lệnh bằng cách sử dụng bash. Ví dụ:

    "scripts": {
      "boogie": "bash bin/my_script.sh"
    }
    

Bây giờ bạn có thể chạy tập lệnh bash của mình từ npm bằng cách:

    npm run-script boogie

Không phải là rất thanh lịch, nhưng nó hoạt động.

Nếu bạn đang phát triển trên cả Windows và Linux / Unix, thì ít nhất cách tiếp cận này khá linh hoạt với cả hai môi trường.


3
Một lựa chọn khác: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
cchamberlain

16

Lý tưởng nhất là ghi đè tham số cấu hình shell npm sẽ hoạt động, nhưng npm (ít nhất là phiên bản 1.4.14) trong Windows dường như bỏ qua cài đặt này và thay vào đó sử dụng cmd.exe.

Sử dụng lệnh sau trong trình bao bash hoặc Git Bash của bạn để tìm hiểu cài đặt trình bao:

$ npm config ls -l | grep shell

Theo mặc định, đầu ra sẽ là:

shell = "C:\\WINDOWS\\system32\\cmd.exe"

Tuy nhiên, để ghi đè tham số shell mặc định, bạn có thể thêm (hoặc chỉnh sửa) tệp npmrc vào thư mục \ Users \ yourusername \ AppData \ Roaming \ npm \ etc. Chỉ cần thêm dòng sau:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"

Đường dẫn bạn sử dụng có thể là bất kỳ đường dẫn hợp lệ nào đến bash.exe. Bây giờ, nếu bạn chạy lệnh "npm config ls -l | grep shell" ở trên, bạn sẽ thấy kết quả sau, cho biết rằng tham số shell đã bị ghi đè:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
; shell = "C:\\WINDOWS\\system32\\cmd.exe" (overridden)

Một ngày nào đó, có lẽ, một phiên bản mới của npm sẽ chú ý đến tham số shell bị ghi đè.


1
Chúc điều này hiệu quả. Tôi đã thay đổi biến môi trường COMSPEC và nó dường như đang kéo từ đó, nhưng tôi không thể làm cho nó hoạt động chính xác.
cchamberlain

4
Đây thực hiện công việc giống nhau:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke

Tôi đã giải quyết vấn đề của mình theo gợi ý của bạn. Bây giờ, tôi có thể chạy các tập lệnh trên npm chứa nhiều lệnh hơn được phân tách bởi ;Trên Windows, trong thư mục C: \ Users \ tên người dùng \ Tôi đã thêm một .npmrctệp có chứashell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx

2

chỉ sử dụng cách của CMD để chạy .bat!

.json
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "app": "cd build & browser-sync start --server --files 'index.html'",
    "bat": "start start-browser.bat",
    "starts": "start http://localhost:7777/datas/ && start http://localhost:7777/Info/"
},
.con dơi
start http://localhost:7777/datas/ && start http://localhost:7777/Info/

1

Sử dụng node_module được tạo cụ thể cho mục đích này. Tôi khuyên bạn nên sử dụng npm-run-all , nhưng những cái khác tồn tại, chẳng hạn như parallelshell .

Dưới đây là ví dụ tương tự để thay thế cho câu hỏi của bạn.

"scripts": {
    "parallelexample1": "parallelshell \"echo 1\" \"echo 2\" \"echo 3\""
},

lệnh sau:

npm run parallelexample1

hoạt động trên cả windows và unix (Linux / MacOS).

Điều thú vị là npm-run-all không hỗ trợ các lệnh shell; do đó chúng ta cần đặt tất cả các lệnh shell để tách các tập lệnh như bên dưới.

"scripts": {
   "parallelexample2": "npm-run-all echo*",
    "echo1": "echo 1",
    "echo2": "echo 2",
    "echo3": "echo 3"
},

Lệnh sau:

npm run parallelexample2

hoạt động trên cả windows và unix (Linux / MacOS).


thanks for the tip cho NPM-run-tất cả, tôi đã thử --paralleltùy chọn cũng
Brandon Søren Culley

1

Trong trường hợp của tôi, tôi chỉ cần chạy npm starttừ bên trong Bash. Tôi chạy cmdsau đó tôi mở bash bằng cách chạy "c:\Program Files\Git\bin\bash.exe". Dưới lớp vỏ bash sau đó, tôi đã có thể gọi npm buildvà thành công npm start.

Bạn có thể đã có bash nếu bạn đang sử dụng Git. Nếu không, bạn có thể cài đặt nó.

Hy vọng điều này có thể tiết kiệm thời gian của ai đó.


Không hoạt động với tất cả các tập lệnh hoạt động trên linux, chẳng hạn như cóPORT=8000
shinzou

0

Bạn cũng có thể sử dụng powershell đa nền tảng https://github.com/powershell/powershell#get-powershell cho các tập lệnh npm.

Để đặt cho một dự án, hãy chạy cái này từ thư mục gốc của dự án:

npm config set script-shell pwsh --userconfig ./.npmrc

Để thiết lập toàn cầu cho tất cả các dự án nút:

npm config set script-shell pwsh [--global]
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.