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

标签 node.js azure npm azure-web-app-service

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

让它在我的本地开发环境中运行是微不足道的。我做的第一件事就是简单地将我自己的模块作为本地依赖项包含在我的 package.json 中,如 https://docs.npmjs.com/files/package.json 中所述。 (参见“本地路径”部分)。现在,一个简单的 npm install 就可以轻松轻松地安装我自己的模块。因为我知道每次部署新版本时 Azure 都会运行 npm install,所以我认为这就是我所需要的。事实证明我错了: package.json dependency 部分中的本地路径仅在 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.

显然它无法安装任何 >= 2.0.0 的 NPM 版本。

好吧,我想这还不错。我可以使用旧版本的 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 或手动管理我的依赖项。我已经花费了太多的时间来解决最初看似微不足道的问题。 :)

最佳答案

Azure 网站团队将于本月底(2015 年 1 月)提供对 npm 2.1.17 的开箱即用支持。希望这能帮助您解锁。

关于node.js - 从 Azure 网站上的文件系统安装 Node.js 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27921000/

相关文章:

javascript - 使用 Node js ('nw.gui' 将对象传递给其他窗口)

azure - 使用消费计划的 Azure 功能的 VNET 集成

javascript - 通过 ng new 命令创建 Angular 新项目是用旧版本创建 package.json

javascript - 如何在 Meteor.js 中使用二进制正文发出 POST 请求

node.js - 如何从 Lerna monorepo 中的包中加载包?

node.js - Node 套接字在 Twitter 流 filter.json 上挂起

node.js - PUT 的 Node JS 请求 promise

python - 如何使用 Python 中的 ADAL 使用 Azure 区 block 链工作台的用户名和密码获取身份验证承载?

asp.net-mvc - 托管 azure MVC 应用程序时,我的 web.config 的 appSettings 集合为空

visual-studio-2015 - 构建 :Cannot find module 'aurelia-http-client'