强制重新安装节点模块

时间:2016-05-07 15:48:27

标签: node.js azure npm azure-web-sites

我在http://fitbit-export.azurewebsites.net/有一个Azure Nodejs网站。当我从Github进行部署时,如果node_modules中已存在的内容与node_modules中的内容不匹配,则Azure只会更新package.json

这意味着,如果我发布了a@^1.0.0等版本规范并发布了a@1.0.1,则除非我更新a@1.0.1以请求{{{}},否则Azure不会安装package.json 1}}。

我猜Azure是这样做的,因为它使部署更快,但对我来说有点令人惊讶,因为我希望部署一个a@^1.0.1的应用程序来接收"a": "^1.0.0"(如果可用)。

我可以通过手动更新a@1.0.1中的所有条目来解决此问题。但是,有没有办法告诉Azure擦除我的整个package.json并重新node_modules

4 个答案:

答案 0 :(得分:0)

您可以自定义Web Apps的默认部署脚本。

要获取默认脚本,请使用azure-cli

azure site deploymentscript --node

deploy.cmd是部署脚本,您可以在其中看到程序包恢复命令:

call :ExecuteCmd !NPM_CMD! install --production

您可以在此处自定义命令或执行任何其他步骤。

要使用自定义脚本,请在源代码管理中检查deploy.cmd以及生成的.deployment文件,以便将其与代码一起部署。

答案 1 :(得分:0)

正如@itaysk所说,您可以尝试为您的webapp自定义部署脚本。

作为参考,我认为有一些有价值且有用的文件。

  1. 部署App Service,https://github.com/projectkudu/kudu/wiki/Deployment
  2. 自定义App Service的部署https://github.com/projectkudu/kudu/wiki/Customizing-deployments
  3. App Service的部署挂钩,https://github.com/projectkudu/kudu/wiki/Deployment-hooks

答案 2 :(得分:0)

问题是,如果package.json中指定的版本低于安装的模块,或者至少是插入符号的情况,则azure自动运行的npm install不会更新任何现有模块(^)

每次(很长一段时间)删除远程服务器上的整个node_modules,而不是在安装软件包后更新.deployment以运行npm update

在你想要推出azure的根存储库中运行azure site deploymentscript --node

这会产生:

.deploymentdeploy.cmd

我们只关心`.deployment。

更新.deployment脚本以添加以下行:

:: 4. Update npm packages
call :ExecuteCmd !NPM_CMD! update
IF !ERRORLEVEL! NEQ 0 goto error

到部署部分:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------

:Deployment
echo Handling node.js deployment.

:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
  IF !ERRORLEVEL! NEQ 0 goto error
)

:: 2. Select node version
call :SelectNodeVersion

IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
  :: 3. Install npm packages
  pushd "%DEPLOYMENT_TARGET%"

  call :ExecuteCmd !NPM_CMD! install --production
  IF !ERRORLEVEL! NEQ 0 goto error

  :: 4. Update npm packages
  call :ExecuteCmd !NPM_CMD! update
  IF !ERRORLEVEL! NEQ 0 goto error

  popd
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end

这会安装您的软件包,然后将它们更新为正确的版本。

通过打开cmd并使用deploy.cmd转到目录并键入“deploy.cmd”来运行它并检查输出来检查它是否正常工作。

答案 3 :(得分:-1)

我相信你看到的是因为Azure Web App automates the deployment using npm install --production所以它没有安装devDependencies。你能否将devDependencies重命名为package.json中的依赖项?