在Azure网站上从文件系统安装Node.js模块

我有一个Node.js应用程序作为Azure网站运行,并使用Gi​​t进行部署。 该应用程序需要一个私人的模块(即我写的,与任何人都没有关系,因此在NPM中不可用)和我的其他项目通用的模块。 假设模块位于./lib/mymodule并且它的package.json文件中有它自己的依赖关系。 问题是我无法弄清楚如何让Azure安装我自己的模块的依赖关系。 我想避免在版本控制(当前.gitignor )下添加我的node_modules目录,或者不得不添加模块的依赖项作为我的应用程序的依赖项(这是丑陋的和不方便的)。

在我的本地开发环境中工作是微不足道的。 我做的第一件事情就是将我自己的模块作为本地依赖项包含在我的package.json ,如https://docs.npmjs.com/files/package.json中所述 (请参阅“本地path”一节)。 一个简单的npm install现在可以安装我自己的模块,非常简单。 因为我知道Azure在每次部署新版本时都会运行npm install ,所以我认为这是我所需要的。 结果我错了: package.json dependencies本地path只在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并编辑它创build的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. 

这是我卡住的地方。 我试着玩弄path,猜测Windows正以某种方式破坏它,但还没有find一个可行的解决scheme。 奇怪的是./lib/mymodule似乎parsing到d:\home\site\wwwroot\lib\mymodule ,这对我来说看起来很好,至less在部署后,当我FTP'd采取看。

我将不胜感激任何和所有帮助获得NPM 2.xx工作或我的自定义部署通过。 或者,也许有一个替代品pipe理我没有想到的本地模块? 如果一切都失败了,也许我只是提交我的node_modules或手动pipe理我的依赖关系。 我已经用了太多的时间来解决第一个看似微不足道的问题。 🙂

Azure WebSites团队将在本月底(1月15日)开箱支持npm 2.1.17。 希望这会帮助你解锁你。