在我的package.json
我有一个脚本来激活我的python虚拟环境(我的项目使用Python和Nodejs)。我基本上想从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
> caltrain-api@0.0.3 activate /Users/jorgesilvajetter/Sites/2015/caltrain-api
> source ./venv/bin/activate
是否可以通过npm命令激活我的虚拟环境?我似乎误解了虚拟环境如何工作或npm如何执行脚本。也许,它在另一个会话/标签中运行脚本?
答案 0 :(得分:2)
从https://docs.npmjs.com/misc/scripts开始,“通过将行作为脚本参数传递给sh来运行脚本。”所以,虽然您使用的是source
,但它位于一个新的子shell中。
只是抬头:npm为./node_modules/.bin
添加PATH
npm脚本,所以在npm脚本中你可以只写"nodemon"
而不是".node_modules/nodemon/bin/nodemon.js"
或{ {1}}。 npm知道用正确的脚本填充".node_modules/.bin/nodemon
因为包作者在./node_modules/.bin
中指定了"bin"
属性。