Thay đổi thư mục làm việc cho các tập lệnh npm


82

Hỏi: Có thể thay đổi ngữ cảnh mà npm chạy script không?

Những gì tôi muốn là như sau:

"scripts": {
   "test": "gulp mocha",
   "pre-install": "./deps/2.7/cpython/configure --prefix=$(pwd)/build --exec-prefix=$(pwd)/build && make -C deps/2.7/cpython && make -C deps/2.7/cpython install",
   "install": "node-gyp rebuild"
},

Rõ ràng là cd deps/2.7/cpython/ && ./configuresẽ hoạt động trên các hệ thống giống UNIX nhưng không hoạt động trên windows.

Lý do: Gốc của vấn đề là configurelệnh của python repo xuất các tệp vào thư mục nơi nó được gọi. Tuy nhiên, các tệp được xây dựng có liên quan makemake installtìm kiếm các tệp trong thư mục của repo.

Trong trường hợp này, tôi không thể thay đổi Makefilevì quá trình xây dựng Python rất phức tạp.

Thay thế: Giải pháp thay thế có thể là viết một số install.jsvà sử dụng API độc lập với hệ điều hành của nút và một số child_process.exec(), điều mà tôi có thể sẽ làm. Tuy nhiên, không rời khỏi npm sẽ thực sự tốt đẹp.


1
Tôi tin rằng không có gì sai khi viết thêm một tập lệnh và chạy tập lệnh đó từ npm.
webduvet

2
cd deps/2.7/cpython/ && ./configuresẽ hoạt động trên Windows - bạn gặp phải vấn đề gì?
Richard Williams

Một số. Bạn không thể sử dụng ./configure --prefix=$(pwd)/somepath. Nó không đẹp. Tôi chưa tìm thấy nó, nhưng npmcó lẽ đang sử dụng var spawn = require('child_process').spawn, điều này sẽ cho phép bạn đặt các tùy chọn như {cwd: pwd + 'somepath'}, nhưng không làm lộ nó. Đó cũng là triết lý: Quản lý gói có vô số chức năng mà chúng có điểm chung với các công cụ xây dựng. Nếu họ đi con đường này, họ cũng cần phải có một số đặc điểm như thế này.
eljefedelrodeodeljefe

2
Tôi đã giải quyết nó bằng một công cụ khá lớn install.js , làm được điều đó và nó được gọi package.jsonnhư trên. child_processMặc dù vậy, API của không dễ xử lý vì nó vượt qua hàng đống lỗi khó gỡ lỗi. Đã khiến tôi mất một khoảng thời gian, nhưng giờ tôi đang hạnh phúc
eljefedelrodeodeljefe

Tác giả của một PR ở đây
eljefedelrodeodeljefe

Câu trả lời:


91

npmchỉ cho phép làm cd dir && command -argsđiều này cũng sẽ chạy trên Windows.

Một thay đổi để sử dụng nodechức năng sinh sản của đã được thực hiện trong PR https://github.com/npm/npm/pull/10958 , nhưng đã bị từ chối, do giải pháp trên.


1
Không chắc liệu tôi đã làm gì đó chưa, nhưng gần đây đã gặp phải lỗi này trong Windows.

6

Như đã nói ở trên:

npm có lẽ đang sử dụng

var spawn = require('child_process').spawn

điều này sẽ cho phép bạn đặt các tùy chọn như:

    {cwd: pwd + 'somepath'}

nhưng không để lộ nó.

Tôi đã giải quyết nó bằng một công cụ khá lớn install.js, làm được điều đó và nó được gọi package.jsonnhư trên. Tuy nhiên, API của child_processkhông dễ xử lý vì nó tạo ra vô số lỗi khó gỡ lỗi. Đã khiến tôi mất một thời gian, nhưng bây giờ tôi hạnh phúc.


Quyền lợi. Thật không may, nó đã bị từ chối trong PR như đã lưu ý trong câu trả lời của tôi.
eljefedelrodeodeljefe

tương tự như: stackoverflow.com/questions/18894433/... mà làm việc cho tôi quá
yeahdixon
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.