Node.js приложение с node -gyp не удается развернуть на лазурном сайте

Я создал сайт Azure, и я пытаюсь использовать пример приложения, которое полагается на node -gyp.

Я получаю следующее:

emote: > [email protected] 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! [email protected] 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 [email protected] 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://[email protected]:443/node-canvas.git
   ef20ef4..147856f  master -> master

У людей есть грациозное разрешение на это или мне нужно развернуть виртуальную виртуальную машину Linux и развернуть это приложение?

Ответ 2

Недавно я успешно развернул приложение Node.js app/Sails, работающее как веб-приложение Azure, которое полагается на Grunt и поэтому нуждается в поддержке для node -gyp. Сначала я боролся с получением node -gyp для непрерывного развертывания без включения папки node_modules, но в итоге я преуспел в том, что вы, надеюсь, называете "грациозным разрешением". Необходимые для меня шаги:

  • Убедитесь, что вы используете несколько обновленную версию Node и NPM (насколько Azure позволяет это сделать: В моем случае я использовал Node 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"  
      },
      
  • Измените настройки в файле config/env/production.js, чтобы дать больше времени на уклонение или что-то еще. Значение по умолчанию 20 с кажется слишком низким для большого количества приложений, однако могут быть более эффективные способы решения этой проблемы: https://github.com/balderdashy/sails/issues/2691 Я положил:

    hookTimeout: 60000, // 60 seconds
    
  • Я использовал файл .deployment и deploy.cmd/deploy.sh(в зависимости от вашей системы), чтобы настроить развертывание на платформе Azure. В качестве руководства я использовал: http://www.cptloadtest.com/2013/12/03/Git-And-Grunt-Deploy-To-Windows-Azure.aspx

    EDIT: выглядит как моя оригинальная команда для запуска Grunt из deploy.cmd неверна, я не знаком с сценариями bash, извините. Я закончил использование script с этим вопросом с некоторыми изменениями: Развертывание приложения NodeJS для Azure Websites не удается установить пакеты NPM из pagages.json из deploy.cmd?
    Использование этой script моей задачи grunt выполняется при развертывании. Вот измененные части моего script.
    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
    )
    
  • Затем я столкнулся с этой ошибкой: ENOTSUP с использованием Grunt, который был с благодарностью недавно решен:)
    Все, что мне осталось сделать, это изменить синтаксис deploy.sh для работы в моем deploy.cmd. Итак, до работает grunt из deploy.cmd. Я включил:

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

Я надеюсь, что это поможет некоторым из вас там, хотя я знаю, что некоторые из проблем, с которыми я столкнулся, могут быть решены с использованием современных версий Node и npm. Но так как Azure не в курсе последних версий, это может быть полезно для некоторых из вас.

EDIT:

Относительно:

  • Node вариант выбора:

    Я попытался выбрать версию Node, установив ее только в 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 [email protected]: [email protected]<2.0.0 is no longer maintained. Upgrade to [email protected]^3.0.0
    npm WARN deprecated [email protected]: DEPRECATED. See readme: https://github.com/gruntjs/grunt-lib-contrib
    npm WARN deprecated [email protected]: [email protected]<2.0.0 is no longer maintained. Upgrade to [email protected]^3.0.0
    > [email protected] 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 [email protected] should be installed with -g
    
    > [email protected] 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, похоже, работает нормально!).