我有一个运行为Azure网站的Node.js应用程序,并使用Git进行部署。该应用程序需要一个私有的模块(即由我编写,与其他任何人无关,因此在NPM中不可用)并且与我的其他项目相同。假设模块位于./lib/mymodule
中,并且它的package.json
文件中有自己的依赖项。问题是我无法弄清楚如何让Azure安装我自己的模块的依赖项。我想避免在版本控制下添加我的node_modules
目录(当前.gitignor
')或者必须将模块的依赖项添加为我的应用程序的依赖项(这很丑陋而且有点不方便)。 / p>
让这个在我的本地开发环境中运行是微不足道的。我做的第一件事就是将我自己的模块作为package.json
中的本地依赖项包含在https://docs.npmjs.com/files/package.json中(参见“本地路径”一节)。一个简单的npm install
现在可以很好地安装我自己的模块。由于我知道每次部署新版本时Azure都运行npm install
,我认为这就是我所需要的。事实证明我错了:package.json
dependencies
部分中的本地路径仅在NPM 2.0.0中引入,而Azure正在运行NPM 1.4.x,因此部署显然失败了。那么,我可以在Azure中运行不同版本的NPM吗?理论上,是的,但实践似乎是另一回事。我尝试了https://github.com/glennblock/azure-node-runtime-selector,但无济于事。以下是一些部署输出:
remote: Handling node.js deployment.
remote: KuduSync.NET from: 'D:\home\site\repository' to: 'D:\home\site\wwwroot'
remote: ............
remote: node version: 0.11.14
remote: ..............
remote: 2.1.18
remote: npm version: 1.4.6
remote: An error has occured during web site deployment.
remote: npm failed
remote:
remote: Error - Changes committed to remote repository but deployment to website failed.
显然它无法安装任何NPM版本> = 2.0.0。
好吧,这不是那么糟糕,我想。我可以使用旧版本的NPM,我只需要运行另一个npm install
来安装我自己的模块,正如NPM文档提示的那样。因此,我将本地依赖项从我的package.json
中移除,只需运行npm install ./lib/mymodule
。很好,很容易......在我当地。我挖出了如何在Azure中部署时运行自定义命令的说明:只需运行azure site deploymentscript --node
并编辑它创建的deploy.sh
。为了确保自定义部署脚本能够正常工作,我进行了一次部署而没有编辑任何内容。工作得好。然后我在deploy.sh
(第111行)附加了一行:
# 3. Install npm packages
if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then
cd "$DEPLOYMENT_TARGET"
eval $NPM_CMD install --production
eval $NPM_CMD install ./lib/mymodule #This line added by me
exitWithMessageOnError "npm failed"
cd - > /dev/null
fi
不。这就是我得到的:
remote: Installing npm packages...
remote: npm ERR! addLocal Could not install ./lib/mymodule
remote: An error has occurred during web site deployment.
remote: npm ERR! Error: ENOENT, stat 'd:\home\site\wwwroot\lib\mymodule'
remote: npm failed
...snip...
remote:
remote: npm ERR! System Windows_NT 6.2.9200
remote: npm ERR! command "d:\\Program Files (x86)\\nodejs\\0.10.28\\node.exe" "D:\\Program Files(x86)\\npm\\1.4.9\\node_modules\\npm\\bin\\npm-cli.js" "install" "./lib/mymodule"
remote: npm ERR! cwd d:\home\site\wwwroot
remote: npm ERR! node -v v0.10.28
remote: npm ERR! npm -v 1.4.9
remote: npm ERR! path d:\home\site\wwwroot\lib\mymodule
remote: npm ERR! code ENOENT
remote: npm ERR! errno 34
remote: npm
remote:
remote: Error - Changes committed to remote repository but deployment to website failed.
这是我被卡住的地方。我试着玩这条路,猜测Windows正在以某种方式破坏它,但还没有找到一个可行的解决方案。奇怪的是,./lib/mymodule
似乎已经解析为d:\home\site\wwwroot\lib\mymodule
,这对我来说很好,并且存在,至少在部署之后,当我进行FTP查看时。
我非常感谢能够让NPM 2.x.x正常工作或者进行自定义部署的所有帮助。或者也许有一种替代方法来管理我没有想到的本地模块?如果所有其他方法都失败了,也许我只是提交我的node_modules
或手动管理我的依赖项。我已经用太多时间来解决首先看起来像是一个微不足道的问题。 :)
答案 0 :(得分:2)
Azure WebSites团队将在月底(Jan' 15)开始提供对npm 2.1.17开箱即用的支持。希望这能帮助你解锁你。