Node.js Azure NodeJS版本

Node.js Azure NodeJS版本,node.js,angular,azure,Node.js,Angular,Azure,好吧,我放弃。为什么Azure有一些默认版本的node(为了gawds的缘故是0.10.x),然后依赖于使用硬编码路径来获得所需的特定版本?这不是我的问题(这是个修辞问题) 这种安排的问题在于,似乎对节点进行了“内部”(对应用程序)调用,当然使用了$PATH中的调用 我们有一个nodejs,express,angular应用程序 我的第一个问题(虽然不是这篇文章的原因)是我在/、angular/和server/目录中嵌套了package.json文件。根用户在子目录上调用install。这在Az

好吧,我放弃。为什么Azure有一些默认版本的node(为了gawds的缘故是0.10.x),然后依赖于使用硬编码路径来获得所需的特定版本?这不是我的问题(这是个修辞问题)

这种安排的问题在于,似乎对节点进行了“内部”(对应用程序)调用,当然使用了$PATH中的调用

我们有一个nodejs,express,angular应用程序

我的第一个问题(虽然不是这篇文章的原因)是我在
/、angular/和server/
目录中嵌套了
package.json
文件。根用户在子目录上调用install。这在Azure中不起作用

我必须通过对已安装的节点模块进行硬编码引用,将对
gulp
ng
的调用转移到Azure
deploy.sh
deploy.sh
包含:

#!/bin/bash

...
NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"`
NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\""
GRUNT_CMD="\"$NODE_EXE\" ./node_modules/gulp/bin/gulp.js"
NG_CMD="\"$NODE_EXE\" ./node_modules/@angular/cli/bin/ng"

...

cd server
eval $NPM_CMD install --production
eval $GRUNT_CMD build

cd ../angular
eval $NPM_CMD install --production
eval $NG_CMD build --prod

cd ..
@import '~@dhsui/kit/styles/dhs-kit-all';
@import "~bootstrap/dist/css/bootstrap.css";
作为NG生产的一部分,构建是一个模拟步骤。它似乎有一个“内部节点调用”,正在失败:

remote: Selected node.js version 10.14.1. Use package.json file to choose a different version.
remote: Selected npm version 6.4.1
...
...
...
remote: Date: 2019-01-04T04:20:42.367Z
remote: ERROR in ./src/styles.scss
remote: Hash: 8062ccafe553f9f5894b
remote: Time: 33752ms
remote: chunk {0} runtime.ec2944dd8b20ec099bf3.js (runtime) 1.41 kB [entry] [rendered]
remote: chunk {1} main.9868d9b237c3a48c54da.js (main) 128 bytes [initial] [rendered]
remote: chunk {2} polyfills.85f47f0bf59079cbc23a.js (polyfills) 130 bytes [initial] [rendered]
remote: chunk {3}  (styles) [initial] [rendered]
remote: An error has occurred during web site deployment.
remote: Module build failed (from D:/home/site/wwwroot/angular/node_modules/mini-css-extract-plugin/dist/loader.js):
remote: ng build in angular failed
remote: ModuleBuildError: Module build failed (from D:/home/site/wwwroot/angular/node_modules/sass-loader/lib/loader.js):
remote: Error: Missing binding D:\home\site\wwwroot\angular\node_modules\node-sass\vendor\win32-ia32-64\binding.node
remote: Node Sass could not find a binding for your current environment: Windows 32-bit with Node.js 10.x
remote:
remote: Found bindings for the following environments:
remote:   - Windows 32-bit with Node 0.10.x
/src/styles.scss
包含:

#!/bin/bash

...
NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"`
NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\""
GRUNT_CMD="\"$NODE_EXE\" ./node_modules/gulp/bin/gulp.js"
NG_CMD="\"$NODE_EXE\" ./node_modules/@angular/cli/bin/ng"

...

cd server
eval $NPM_CMD install --production
eval $GRUNT_CMD build

cd ../angular
eval $NPM_CMD install --production
eval $NG_CMD build --prod

cd ..
@import '~@dhsui/kit/styles/dhs-kit-all';
@import "~bootstrap/dist/css/bootstrap.css";
我尝试进行更改,将所需版本的节点目录预先添加到路径中(并更改为仅调用
节点
,而不是Azure似乎要求您执行的完整路径):

但它在同一个地方失败了。因此,我的问题似乎不是
对节点进行“内部”(应用程序)调用,当然是使用$PATH中的调用。
!(这个更改实际上不起作用,所以我恢复了)

有人知道为什么要为
节点0.10.x设置绑定,以及可以采取哪些措施来防止此问题吗?

有一个Project Kudu for Azure WebApps的wiki页面,可以回答您关于节点版本的问题。在2017年10月31日之前编辑wiki页面时,默认节点版本为
v0.6.20
,现在为
0.10.40
。这似乎取决于Azure WebApps的部署模板

创建Web应用程序后,您可以在Azure portal的选项卡
应用程序设置
中配置Azure
网站节点\u默认版本
的值以更改默认节点版本,如下图所示,如wiki页面
可配置设置
的小节所示

关于Azure WebApps中所有可用的节点版本,您可以在Kudu console的路径
D:\Program Files(x86)\nodejs
下命令
ls
,将它们列为下图

设置
网站\u节点\u默认\u版本
后,网站将自动重新启动,节点版本已升级

然后,您可以使脚本直接在当前节点版本上工作,而不考虑这些环境变量,如
PATH
或其他关于节点的变量。

我不得不这样做

npm rebuild node-sass
在运行
ng build--production
之前

我在错误消息中发现了一条关于此的注释。我最初对此不屑一顾,因为
npm安装
是在
ng构建
之前运行的,所以它看起来是多余的。不那么明显

我不知道为什么会以某种方式引用
nodejs 0.10.x


我刚刚收到@PeterPan关于选择默认nodejs版本的回复。这也许可以回答为什么要使用不同的版本(因为幸运的是,可以选择默认版本)。我打算检验彼得的答案


我不喜欢Azure(至少是Windows NT server)节点安装的方式,它的工作方式与我的MacOSX设备不完全相同。节点是跨平台的,并且在任何地方的行为都应该相同(对于特定于平台的模块,如
fsevents
)。我认为这是一次失败。作为提醒,我为Mac/Linux提供了一种方法,为Azure提供了另一种方法

我也会尝试在Azure下的Linux上安装这个node/express/angular web应用程序,看看这是否更好(不幸的是,我工作的地方被锁定在“Windows”的思维中,所以我认为这样做不会有多大进展)


感谢Microsoft允许使用bash脚本。

谢谢Peter,这似乎可以解决我的问题和我强调的另一个问题(但通过将步骤移动到
deploy.sh
),这是一个一轮的工作)。我有一个解决我最新问题(问题)的答案,并将发布。我将尝试部署一个新版本来测试您的答案。这可能是解决方案,这对我来说是个问题。这意味着随着时间的推移,您将需要保持此设置与应用程序同步(在存储库中进行版本控制)。非常感谢Peter的工作。我必须明确指出,对我们使用的nodejs版本进行的主要或可能次要的Semver更改也需要对其进行更改。我仍然不明白为什么Azure不只是创建一个从
../nodejs
nodeversions\x.y.z
的符号链接来防止这个问题。请注意,@PeterPans的解决方案要好得多。