使用node-gyp的node.js应用程序无法在Azure网站上部署

我build立了一个Azure网站,我试图使用一个依赖于node-gyp的示例应用程序。

我得到这个:

emote: > node-expat@2.0.0 install C:\DWASFiles\Sites\node-canvas\VirtualDirectory0\site\wwwroot\node_modules\node-salesforce\node_modules\xml2json\node_modules\node-expat remote: > node-gyp rebuild remote: remote: remote: C:\DWASFiles\Sites\node-canvas\VirtualDirectory0\site\wwwroot\node_modules\node-salesforce\node_modules\xml2json\node_modules\node-expat>node "D:\Program Files (x86)\npm\1.2.18\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild remote: Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. remote: MSBUILD : error MSB3428: Could not load the Visual C++ component "VCBuild.exe". To fix this, 1) install the .NET Framework 2.0 SDK, 2) install Microsoft Visual Studio 2005 or 3) add the location of the component to the system path if it is installed elsewhere. [C:\DWASFiles\Sites\node-canvas\VirtualDirectory0\site\wwwroot\node_modules\node-salesforce\node_modules\xml2json\node_modules\node-expat\build\binding.sln] remote: gypnpm ERR! node-expat@2.0.0 install: `node-gyp rebuild` remote: npm ERR! `cmd "/c" "node-gyp rebuild"` failed with 1 remote: npm ERR! remote: An error has occurred during web site deployment. remote: npm ERR! Failed at the node-expat@2.0.0 install script. remote: npm ERR! This is most likely a problem with the node-expat package, remote: npm ERR! not with npm itself. remote: npm ERR! Tell the author that this fails on your system: remote: npm ERR! node-gyp rebuild remote: npm ERR! You can get their info via: remote: npm ERR! npm owner ls node-expat remote: npm ERR! There is likely additional logging output above. remote: remote: npm ERR! System Windows_NT 6.2.9200 remote: npm ERR! command "D:\\Program Files (x86)\\nodejs\\0.8.19\\node.exe" "D:\\Program Files (x86)\\npm\\1.2.18\\bin\\npm-cli.js" "install" "--production" remote: npm ERR! cwd C:\DWASFiles\Sites\node-canvas\VirtualDirectory0\site\wwwroot remote: npm ERR! node -v v0.8.19 remote: npm ERR! npm -v 1.2.18 remote: npm ERR! code ELIFECYCLE remote: npm remote: remote: Error - Changes committed to remote repository but deployment to website failed, please check log for further details. To https://mike@node-canvas.scm.azurewebsites.net:443/node-canvas.git ef20ef4..147856f master -> master 

人们有一个优雅的解决scheme,或者我需要启动一个Linux虚拟机和部署这样的应用程序?

网站的限制。 请参阅http://azure.microsoft.com/en-us/documentation/articles/nodejs-use-node-modules-azure-apps/的本机模块部分。

解决方法/解决scheme是将所有模块安装在Windows开发箱中,并将node_modules作为git部署的一部分。

我最近成功地部署了一个Node.js应用程序/ Sails应用程序,作为依赖于Grunt的Azure Web应用程序运行,因此也需要对node-gyp的支持。 起初,我努力让node- gyp不包含node_modules文件夹的连续部署运行,但是最终我成功地用了一个你希望称为“优美的解决scheme”的东西。 我需要的步骤是:

  1. 确保你使用了一个稍微更新的Node和NPM版本(就Azure而言,你可以这样做):在我的情况下,我使用了节点5.4.0和npm 3.3.12。在Azure上部署有两种方法我知道要做到这一点:

    • 应用程序设置 :WEBSITE_NODE_DEFAULT_VERSION 5.4.0(或其他)
    • Package.json文件:包含以下内容:

       "engines": { "node": "5.4.0", "npm": "3.3.12" }, 
  2. 改变config / env / production.js文件中的设置,让grunt有更多的时间来uglify或者其他的东西。 20s的默认值似乎太低了很多的应用程序,但是可能有更好的方法来解决这个问题: https : //github.com/balderdashy/sails/issues/2691我说:

     hookTimeout: 60000, // 60 seconds 
  3. 我使用了.deploymentdeploy.cmd / deploy.sh(取决于您的系统)文件来自定义Azure平台上的部署。 我使用的指南是: http : //www.cptloadtest.com/2013/12/03/Git-And-Grunt-Deploy-To-Windows-Azure.aspx

    编辑:看起来像我的原始命令从部署.cmd运行Grunt是不正确的,我不熟悉bash脚本,对不起。 我最终使用了这个问题的脚本进行了一些修改: 将NodeJS应用程序部署到Azure网站时,从deploy.cmd的pagages.json安装NPM软件包失败?
    使用这个脚本我的grunt任务运行在部署上。 这里是我的脚本的修改部分。
    deploy.cmd:

     :: Setup :: ----- :: ... some default parts omitted IF NOT DEFINED GRUNT_CMD ( :: Install grunt echo Installing Grunt call npm --registry "http://registry.npmjs.org/" install grunt-cli IF !ERRORLEVEL! NEQ 0 goto error :: Locally just running "grunt" would also work SET GRUNT_CMD=node "%DEPLOYMENT_SOURCE%\node_modules\grunt-cli\bin\grunt" ) goto Deployment :: Utility Functions :: ----------------- :SelectNodeVersion :: ... some default parts omitted :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :Deployment echo Handling node.js deployment. echo %DEPLOYMENT_SOURCE% echo 1. Select node version call :SelectNodeVersion echo 2. Install npm packages dev dependencies IF EXIST "%DEPLOYMENT_SOURCE%\package.json" ( pushd "%DEPLOYMENT_SOURCE%" echo Cleaning NPM cache. call !NPM_CMD! cache clean call !NPM_CMD! install --development IF !ERRORLEVEL! NEQ 0 goto error popd ) echo 4. Run grunt prod task pushd %DEPLOYMENT_SOURCE% call !GRUNT_CMD! --no-color prod IF !ERRORLEVEL! NEQ 0 goto error popd echo 5. 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 ) echo 6. Install npm packages production IF EXIST "%DEPLOYMENT_TARGET%\package.json" ( pushd %DEPLOYMENT_TARGET% call !NPM_CMD! install --production IF !ERRORLEVEL! NEQ 0 goto error popd ) 
  4. 然后我遇到了这个错误: ENOTSUP使用Grunt ,幸好最近解决了:)
    所有剩下的工作就是改变我的deploy.cmd中的deploy.sh语法。 所以deploy.cmd运行grunt 之前 ,我包括:

     echo 3. Update erroneous glob dependency in Grunt pushd "%DEPLOYMENT_SOURCE%\node_modules\grunt" call :ExecuteCmd !NPM_CMD! install glob@^6.0.4 --save IF !ERRORLEVEL! NEQ 0 goto error popd 

我希望这可以帮助你们中的一些人,尽pipe我知道,我所面临的一些问题可以通过使用最新版本的node和npm来解决。 但是,由于Azure不能提供最新版本,所以这对您可能还是有帮助的。

编辑:

关于:

  1. 节点版本select:

    我试图通过在Package.json中设置它来select节点版本,而不更改应用程序设置(默认版本:4.2.3)中的默认设置,但我仍然遇到以下错误:

     Node.js versions available on the platform are: 0.6.20, 0.8.2, 0.8.19, 0.8.26, 0.8.27, 0.8.28, 0.10.5, 0.10.18, 0.10.21, 0.10.24, 0.10.26, 0.10.28, 0.10.29, 0.10.31, 0.10.32, 0.10.40, 0.12.0, 0.12.2, 0.12.3, 0.12.6, 4.0.0, 4.1.0, 4.1.2, 4.2.1, 4.2.2, 4.2.3, 4.2.4, 5.0.0, 5.1.1, 5.3.0, 5.4.0, 5.5.0. Selected node.js version 5.4.0. Use package.json file to choose a different version. Selected npm version 3.3.12 Updating iisnode.yml at D:\home\site\wwwroot\iisnode.yml 3. Install npm packages npm WARN deprecated lodash@0.9.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0 npm WARN deprecated grunt-lib-contrib@0.7.1: DEPRECATED. See readme: https://github.com/gruntjs/grunt-lib-contrib npm WARN deprecated lodash@1.0.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0 > sails@0.11.4 preinstall D:\home\site\wwwroot\node_modules\.staging\sails-bbe9b0ace9f7789c8522238af14fe27a > node ./lib/preinstall_npmcheck.js Sails.js Installation: Checking npm-version successful npm WARN prefer global grunt-cli@0.1.13 should be installed with -g > fibers@1.0.8 install D:\home\site\wwwroot\node_modules\fibers > node build.js || nodejs build.js D:\home\site\wwwroot\node_modules\fibers>if not defined npm_config_node_gyp (node "c:\Program Files (x86)\npm\3.3.12\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild --release ) else (node rebuild --release ) Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. fibers.cc coroutine.cc ..\src\fibers.cc : fatal error C1902: Program database manager mismatch; please check your installation [D:\home\site\wwwroot\node_modules\fibers\build\fibers.vcxproj] ..\src\coroutine.cc : fatal error C1902: Program database manager mismatch; please check your installation [D:\home\site\wwwroot\node_modules\fibers\build\fibers.vcxproj] gyp ERR! build error gyp ERR! stack Error: `msbuild` failed with exit code: 1 gyp ERR! stack at ChildProcess.onExit (c:\Program Files (x86)\npm\3.3.12\node_modules\npm\node_modules\node-gyp\lib\build.js:270:23) gyp ERR! stack at emitTwo (events.js:87:13) gyp ERR! stack at ChildProcess.emit (events.js:172:7) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12) gyp ERR! System Windows_NT 6.2.9200 gyp ERR! command "D:\\Program Files (x86)\\nodejs\\4.2.3\\node.exe" "c:\\Program Files (x86)\\npm\\3.3.12\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--release" gyp ERR! cwd D:\home\site\wwwroot\node_modules\fibers gyp ERR! node -v v4.2.3 gyp ERR! node-gyp -v v3.0.3 Build failed 

    就像你可以看到的第一个状态:

     Selected node.js version 5.4.0. Use package.json file to choose a different version. 

    根据Package.json文件。
    但是,稍后在错误消息中,这似乎已经改变:

     gyp ERR! node -v v4.2.3 

    对我来说,为什么会出现这个错误并不是很明显,因为Package.json文件中的版本应该覆盖应用程序设置中的默认值。 所以要确定只是将两个设置设置为一个足够高的版本(不知道什么时候node-gyp问题解决了,但5.4.0似乎工作正常!)。