2015-12-27 35 views
6

Ai đó có thể giải thích cách hoạt động của nút được cài đặt trên toàn cầu. Nó thực sự gây nhầm lẫn cho tôi. Nếu tôi cài đặt một gói (với thực thi) như http-server toàn cầu tôi có thể chạy nó với:Chạy các gói được cài đặt trên toàn cầu npm

http-server 

Nhưng nếu tôi làm

node http-server 

tôi nhận được

module.js:339 
    throw err; 
    ^

Error: Cannot find module '/path/to/current/dir/http-server' 
    at Function.Module._resolveFilename (module.js:337:15) 
    at Function.Module._load (module.js:287:25) 
    at Function.Module.runMain (module.js:457:10) 
    at startup (node.js:136:18) 
    at node.js:972:3 

tôi nghi ngờ tern của tôi gói trong emacs đang cố gắng chạy nó với node do đó vi phạm. Tại sao chuyện này đang xảy ra? Tại sao nút không thể tìm thấy đường dẫn đến mô-đun riêng của nó?

Trả lời

2
[email protected]:~$ node blalal 
module.js:338 
throw err; 
^ 

Error: Cannot find module '/home/rahul/blalal' 
at Function.Module._resolveFilename (module.js:336:15) 
at Function.Module._load (module.js:286:25) 
at Function.Module.runMain (module.js:475:10) 
at startup (node.js:117:18) 
at node.js:951:3 

ooh cùng lỗi

này là bởi vì tôi lệnh đầu tiên bạn đang thực sự cố gắng để truy cập vào một biến toàn cầu nhưng trong thứ hai bạn là một số nơi trong hệ thống phân cấp tập tin của bạn và từ đó bạn đang nói rằng bạn muốn truy cập mà gói, do đó bạn là sai nếu bạn muốn thực hiện điều đó gói toàn cầu thử

whereis http-server 

sau đó đi đến thư mục đó và tìm tập tin package.json và sau đó mở nó và tìm ra "chính" bất động sản và có bạn nhận được tên tệp rồi nhập

node index.js 

tập tin của bạn sẽ được thực hiện

0

Khi bạn cài đặt thứ gì đó trên toàn cầu, bạn lưu trữ một biến có đường dẫn được lưu trữ liên kết với biến đó cũng như chương trình thực thi. Trong khi hệ điều hành của bạn sẽ biết cách truy cập nó. Nút sẽ không. Nếu bạn muốn "node something.js" bạn có nhiều trong thư mục đó hoặc điều chỉnh đường dẫn của bạn để nút đó biết cách truy cập tệp. ví dụ: nút "c: /jsapps/main/app.js" hoặc nếu bạn ở trong cho phép nói thư mục 'jsapps' bạn sẽ nhập nút "main/app.js" để thực thi cùng một tệp.

3

Có hai cách cài đặt gói: globallylocally.
Địa phương tệp gói đã cài đặt kết thúc tại địa phương của bạn node_modules (trong thư mục dự án của bạn nơi bạn gọi là npm install some-package).
Toàn cầu Cài đặt các tệp gói trong hệ thống của bạn để chúng có sẵn trong dòng lệnh, nếu gói được cài đặt trên toàn cầu cung cấp tệp thực thi thì bạn có thể gọi nó trực tiếp some-package (nếu không có node), nếu nó không cung cấp được có thể sử dụng nó ở chế độ repl (node) như var package = require('some-package') và nó cũng có sẵn cục bộ (bên trong thư mục dự án của bạn ngay cả khi bạn không cài đặt nó cục bộ).

2

Điều này bắt đầu là nhận xét nhưng hiện đã lâu hơn một chút.

Vấn đề không chính xác node không tìm gói toàn cầu, node chỉ tìm kiếm gói ở vị trí hiện tại (như dưới node_modules), và đó là theo thiết kế. Các gói được cài đặt trên toàn cầu có thể được chạy từ lệnh giống như cách thức npm cài đặt chúng, và đây là những gì làm cho các gói toàn cầu trở nên đặc biệt theo một cách nào đó.

Trên hệ thống dựa trên Unix, npm tạo liên kết mềm đến các tệp thực thi chính của các gói được cài đặt toàn cầu, như http-server trong một thư mục trong đường dẫn có thể thực thi. Trên máy của tôi, đây là /usr/local/bin/. Đây là lý do tại sao những lệnh này có thể được gọi từ dòng lệnh mà không chỉ rõ đường dẫn đầy đủ.

Trên Windows, npm tạo tệp lô thực thi được đặt tên cho ví dụ http-server.cmd dưới %APPDATA% (thường là một cái gì đó như C:\Users\YourUserName\AppData\Roaming). Tệp lô chứa các hướng dẫn để chạy tệp đích thực thi từ vị trí thực sự được cài đặt.

+0

Nhưng tại sao không thể tôi chạy chúng với 'nút [package-name]'? Một số gói (gói emacs) cố gắng chạy các gói này với tiền tố 'nút' là phần khó hiểu – Arijoon

+0

@Arijoon Có lẽ vì các gói đó mong muốn tìm thấy các gói phụ thuộc của chúng được cài đặt cục bộ. –

+0

ok làm thế nào tôi có thể chắc chắn rằng họ tìm thấy phụ thuộc của họ trên toàn cầu? Vì nếu tôi thậm chí cài đặt cùng một gói cục bộ, nó vẫn không chạy với 'node [package-name]' – Arijoon

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