2012-08-10 109 views
0

我認爲npm install|update需要依賴源文件,但當我想運行一個可執行文件,如nodemon,它似乎不工作。它試圖在全球範圍內尋找文件嗎?我怎樣才能讓這些命令先看看node_modulesNPM package.json依賴關係及其在本地和全局的可執行文件


我有一個Cakefile,用nodemon啓動dev服務器。例如:

# **`procExec(procName)`** 
# returns the path to executable in `node_` 
procExec = (procName) -> 
    console.log "./node_modules/" + procName + "/bin/" + procName 
    "./node_modules/.bin/" + procName 

# **`cake startdev`** 
# Starts the server with `nodemon` 
# Watch and compile `.coffee` and `.styl` files in `/client` 

task "startdev", "Starts server with nodemon and watch files for changes", -> 
    # start nodemon server 
    nodemon = spawn procExec("nodemon"), ["server.coffee"] 
    processOutput nodemon 

    # watch and compile CoffeeScript 
    coffee = spawn procExec("coffee"), ["-o", "public/js/app", "-cw", "client/coffee"] 
    processOutput coffee 

    # watch and compile Stylus 
    stylus = spawn procExec("stylus"), ["client/stylus", "-l", "-w", "-o", "public/css/app"] 
    processOutput stylus 

它的工作原理,但有一些小問題:

  • npm install|update似乎沒有安裝nodemon。我認爲它試圖在全球安裝並失敗。我手動單獨做了npm install nodemon。爲什麼是這樣?我怎麼能告訴nodemon無論如何安裝?
  • "./node_modules/.bin/" + procName是否總是解析爲正確的可執行文件?

回答

2

這裏有幾個問題,所以我會盡量讓它們分開。

npm install | update似乎沒有安裝nodemon。我認爲它試圖在全球安裝並失敗。我手動單獨做了一個npm install nodemon。爲什麼是這樣?我怎麼能告訴nodemon安裝呢?

您是否看到關於「喜歡全局安裝」的警告?如果是這樣的話,那只是一個警告,反正它已經被安裝了。如果這是一個不同的錯誤,請包括輸出。

「./node_modules/.bin/」+ procName是否總是解析爲正確的可執行文件?

是的,您的依賴關係的package.json文件中列出的任何腳本都將安裝到此文件夾中。但是,我更喜歡使用npm bin命令始終獲得正確的路徑。

如果您正在從節點生成進程,您還可以使用require('npm')並修改process.env.PATH以獲取正確的node_modules/.bin。例如。在你Cakefile的頂部:

npm = require 'npm' 
npm.load (err) -> throw err # If config fails to load, bail out early 
process.env.PATH = npm.bin + ":" + process.env.PATH 
# Now you no longer need to use procExec in your tasks 

免責聲明我不知道是否修改PATH一樣,將工作在Windows上。

+0

Wheres the'npm = require ...'中的代碼是產生該過程的答案的一部分嗎? – 2012-08-20 07:03:03

+0

對不起,我沒有看到這一段時間。你仍然會像以前一樣使用'spawn',但沒有procExec幫助器。 – grncdr 2012-08-28 00:28:02

相關問題