2015-08-23 106 views
0

在我的package.json我有一個腳本來激活我的python虛擬環境(我的項目同時使用Python和Nodejs)。我基本上想從npm激活我的虛擬環境。激活虛擬環境不起作用從npm命令

"scripts": { 
    "babel-node": "babel-node --stage 0 --ignore='foo|bar|baz'", 
    "test": "export NODE_ENV='test'; ./node_modules/mocha/bin/mocha --compilers js:babel/register server/test/index.js", 
    "dev": "./node_modules/nodemon/bin/nodemon.js --exec npm run babel-node -- server/index.js", 
    "activate": "source ./venv/bin/activate", 

    "import": "python scraper -g -i -db caltrain_test && python ./scraper -g -i", 
    "start": "node ./server", 
    "docs": "cp README.md docs/index.md && ./node_modules/docco/bin/docco --layout=linear ./docs/index.md" 
}, 

如果激活我的虛擬環境中直接形成的命令行,它的工作原理:

jorgesilvajetter at Jorges-MacBook-Pro-2 in ~/Sites/2015/caltrain-api on master [!?$] 
$ source venv/bin/activate 
(venv) // This means that it worked! 

但如果我運行從NPM相同的命令,這是行不通的:

jorgesilvajetter at Jorges-MacBook-Pro-2 in ~/Sites/2015/caltrain-api on master [!?$] 
$ npm run activate 

> [email protected] activate /Users/jorgesilvajetter/Sites/2015/caltrain-api 
> source ./venv/bin/activate 

是否可以通過npm命令激活我的虛擬環境?看來我誤解了虛擬環境的工作原理或npm如何執行腳本。也許,它在另一個會話/標籤中運行腳本?

回答

2

https://docs.npmjs.com/misc/scripts,「腳本通過將該行作爲腳本參數傳遞給sh來運行」。所以,雖然你使用的是source,但它在一個新的子shell中。

而剛剛擡起頭:NPM增加./node_modules/.binPATH爲NPM腳本,所以在NPM腳本,你可以只寫e.g "nodemon",而不是".node_modules/nodemon/bin/nodemon.js"".node_modules/.bin/nodemon。 npm知道使用正確的腳本填充./node_modules/.bin,因爲程序包作者在其package.json中指定了"bin"屬性。

+0

很酷,這是有道理的。是的,我知道第二部分。我想我只是喜歡那個符號,因爲它明確指出'nodemon'是項目的依賴項,並且不需要全局安裝,但是如果你願意的話,你可以不同意我。 –