I have set up an Azure website and I am trying to use a sample application that relies on node-gyp.
I am getting this:
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
Do people have a graceful resolution to this or do I need to spin up a linux VM and deploy the application like that?
Limitation of web sites. See the native modules section of http://azure.microsoft.com/en-us/documentation/articles/nodejs-use-node-modules-azure-apps/.
The workaround/resolution is to install all the modules on a Windows dev box and include node_modules as part of the git deployment.
I recently successfully deployed a Node.js app/ Sails app running as an Azure web app that relies on Grunt and therefore needs support for node-gyp as well. At first I struggled with getting node-gyp to run on continuous deployment without including the node_modules folder but finally I succeded with a what you would hopefully call "graceful resolution". The steps that were necessary for me are:
Make sure you use a somewhat up to date version of Node and NPM (as far as Azure allows you to do so: . In my case I used node 5.4.0 and npm 3.3.12. Deploying on Azure there is two ways I know of to do this:
Package.json file: Include the following:
"engines": {
"node": "5.4.0",
"npm": "3.3.12"
},
Change the settings in the config/env/production.js file to give grunt more time to uglify or whatever. The default value of 20s seems to be too low for a lot of applications out there, however there might be better ways to solve this: https://github.com/balderdashy/sails/issues/2691 I put:
hookTimeout: 60000, // 60 seconds
I used a .deployment and deploy.cmd / deploy.sh (depending on your system) file to customize the deployment on the Azure platform. The guide I used was: http://www.cptloadtest.com/2013/12/03/Git-And-Grunt-Deploy-To-Windows-Azure.aspx
EDIT: looks like my original command to run Grunt from deploy.cmd is incorrect, I am not familiar with bash scripts, sorry. I ended up using the script from this question with some modifications: Deploying a NodeJS App to Azure Websites fails on installing NPM packages from pagages.json from deploy.cmd?
Using this script my grunt task runs on deployment. Here are the modified parts of my 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
)
I then ran into this error: ENOTSUP using Grunt which was thankfully recently solved :)
All that was left for me to do was to change the for deploy.sh given syntax to work in my deploy.cmd. So before running grunt from deploy.cmd I included:
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
I hope this helps some of you out there, although I am aware, that some of the issues I faced might be solved using up to date versions of node and npm. But since Azure does not out of the box provide the latest versions this might still be helpful for some of you.
EDIT:
Regarding:
Node version choice:
I tried to select the node version by only setting it in Package.json without changing the default settings in the Application settings (default version: 4.2.3) and I still got the following error:
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]: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
npm WARN deprecated [email protected]: DEPRECATED. See readme: https://github.com/gruntjs/grunt-lib-contrib
npm WARN deprecated [email protected]: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^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
Like you can see it first states:
Selected node.js version 5.4.0. Use package.json file to choose a different version.
according to the Package.json file.
However, later on in the error message this seems to have changed:
gyp ERR! node -v v4.2.3
To me it is not obvious why this error occurs since the version in the Package.json file should be overwriting the default in the Application settings. So to be sure just set both settings to a high enough version (not sure when the node-gyp problem was solved, but 5.4.0 seems to be working fine!).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With