首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当传递--icu-data-dir Node选项时,完整的icu工作,但在使用NODE_ICU_DATA环境变量时不起作用。

当传递--icu-data-dir Node选项时,完整的icu工作,但在使用NODE_ICU_DATA环境变量时不起作用。
EN

Stack Overflow用户
提问于 2020-12-22 05:11:12
回答 2查看 3.1K关注 0票数 2

情况

我的应用程序(AlpinLinux3.11,nodeJS v12.15.0)有一个阿尔卑斯/nodeJS映像,我最近需要在这个应用程序中实现货币国际化。

我注意到我的容器丢失了地点,所以我需要安装完整的ICU。因此,我修改了基于高山的Docker映像,添加了两行代码来安装完整的ICU。

代码语言:javascript
复制
RUN npm i -g full-icu
ENV NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu”

安装进行得很顺利,控制台输出说:

代码语言:javascript
复制
Step 10/15 : RUN npm i -g full-icu
 ---> Running in b14d826c8689
/home/node/.npm/bin/node-full-icu-path -> /home/node/.npm/lib/node_modules/full-icu/node-icu-data.js

> full-icu@1.3.1 postinstall /home/node/.npm/lib/node_modules/full-icu
> node postinstall.js

npm install icu4c-data@64l (Node 12.15.0 and small-icu 64.2) -> icudt64l.dat
full-icu$ /usr/bin/node /home/node/.npm/lib/node_modules/npm/bin/npm-cli.js install icu4c-data@64l
+ icu4c-data@0.64.2
added 1 package from 1 contributor in 62.073s
 √ icudt64l.dat (link)
Node will use this ICU datafile if the environment variable NODE_ICU_DATA is set to “/home/node/.npm/lib/node_modules/full-icu”
or with node --icu-data-dir=/home/node/.npm/lib/node_modules/full-icu YOURAPP.js
 For package.json:
{"scripts":{"start":"node --icu-data-dir=/home/node/.npm/lib/node_modules/full-icu YOURAPP.js"}}

By the way, if you have full data, running this in node:
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
... will show “enero”. If it shows “January” you don't have full data.
News: Please see https://github.com/icu-project/full-icu-npm/issues/6
+ full-icu@1.3.1
added 1 package from 1 contributor in 63.276s

它似乎很好,它承认了我的NodeJS版本,没有错误。我可以检查并看到ICU的数据文件在正确的地方。

问题

但是,当打开这个容器内的shell (运行docker run -ti myimage sh)并使用Intl时,我注意到只有在使用--icu-data-dir选项运行节点时,区域设置才能正常工作,而不是在使用NODE_ICU_DATA环境变量时。但是,由于各种原因,我肯定会选择环境变量,所以我希望它能够工作。

目前为止的测试

下面是我在node上的测试

node --icu-data-dir=/home/node/.npm/lib/node_modules/full-icu

代码语言:javascript
复制
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'enero'

它的意思是“能量”,所以它起作用了。这意味着完整的ICU是正确安装和可达的。

export NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu” node

代码语言:javascript
复制
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'January'

它不关心我的环境变量(也尝试将环境变量放入Dockerfile中,如上面所示)

env NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu” node

代码语言:javascript
复制
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'January'

它也不在乎环境变量何时内联。

顺便说一下,我还尝试使用.js脚本,而不仅仅是NodeJS控制台,还有各种传递环境变量的方法。

为了确定,我试着用RUN apk --update add --no-cache icu icu-libs icu-dev安装系统ICU包。

所以..。

是否有人知道为什么在环境变量中指定路径不起作用,以及我应该检查什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-12 05:01:18

对于任何关注这个问题的人来说,问题都是特定于版本的。

部署最新的NodeJS版本修复了这些ICU缺陷。

票数 0
EN

Stack Overflow用户

发布于 2021-03-23 05:26:48

我和普列斯克的VPS有同样的问题。我无法更新Node版本,而已安装的Node版本是,v12.4.0。

在我的例子中,我也不能将完整的icu安装为全局模块,流程管理器在没有在package.json中运行启动脚本的情况下启动我的应用程序。

在这种情况下,加载完整的icu支持的唯一方法是使用环境vars。

我首先尝试通过命令行:

代码语言:javascript
复制
export NODE_ICU_DATA=/full/path/of/my/app/node_modules/full-icu

然后

代码语言:javascript
复制
-bash-4.2$ /opt/plesk/node/12/bin/node
Welcome to Node.js v12.4.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('it',{month:'long'}).format(new Date(9E8));
'gennaio'
>

效果很好。

如果我在我的应用程序的根文件夹中运行这个命令,它也能工作:

代码语言:javascript
复制
NODE_ICU_DATA=node_modules/full-icu /opt/plesk/node/12/bin/node

因此,我在app节点设置中添加了一个ENV变量(在Plesk中)

NODE_ICU_DATA

有价值

node_modules/full-icu

重新启动i18n支持的应用程序是正确的。

我希望这能帮助那些处于我同样处境的人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65403546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档