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

mik*_*ebz 12 azure node.js node-gyp

我已经建立了一个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
Run Code Online (Sandbox Code Playgroud)

人们对此有一个优雅的解决方案,还是我需要启动Linux VM并部署这样的应用程序?

小智 9

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

解决方法/解决方案是在Windows开发框中安装所有模块,并将node_modules包含在git部署中.

  • 这不是一个很好的解决方案,自2013年10月以来的任何更新? (2认同)

小智 5

我最近成功部署了一个运行为Azure Web应用程序的Node.js app/Sails应用程序,该应用程序依赖于Grunt,因此也需要对node-gyp的支持.起初我努力让node- gyp不包含node_modules文件夹的情况下在连续部署上运行,但最后我成功了一个你希望称之为"优雅分辨率"的东西.我需要的步骤是:

  1. 确保使用最新版本的Node和NPM(就Azure而言,允许你这样做:.在我的例子中,我使用了节点5.4.0和npm 3.3.12.在Azure上部署有两种我知道的方法做到这一点:

  2. 更改config/env/production.js文件中的设置,以便为uglify或其他任何内容提供更多时间.对于很多应用程序来说,默认值20s似乎太低了,但是可能有更好的方法来解决这个问题:https://github.com/balderdashy/sails/issues/2691 我把:

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

    编辑:看起来我从deploy.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
    )
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后我遇到了这个错误:ENOTSUP使用Grunt,幸好最近解决了:)
    所有留给我的是更改for deploy.sh给定的语法在deploy.cmd中工作.所以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
    
    Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你们中的一些人,虽然我知道,我面临的一些问题可能会使用最新版本的node和npm来解决.但是,由于Azure没有开箱即用提供最新版本,这可能对您有些人有用.

编辑:

关于:

  1. 节点版本选择:

    我尝试通过仅在Package.json中设置节点版本而不更改应用程序设置中的默认设置(默认版本: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
    
    Run Code Online (Sandbox Code Playgroud)

    就像你可以看到它首先说明:

    Selected node.js version 5.4.0. Use package.json file to choose a different version.
    
    Run Code Online (Sandbox Code Playgroud)

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

    gyp ERR! node -v v4.2.3
    
    Run Code Online (Sandbox Code Playgroud)

    对我来说,由于Package.json文件中的版本应该覆盖应用程序设置中的默认值,因此发生此错误的原因并不明显.所以要确保将两个设置都设置为足够高的版本(不确定node-gyp问题何时解决,但5.4.0似乎工作正常!).