full-ICU 在传递 --icu-data-dir 节点选项时有效,但在使用 NODE_ICU_DATA 环境变量时无效
full-ICU works when passing the --icu-data-dir Node option, but not when using the NODE_ICU_DATA environment variable
情况
我有一个 Alpine/NodeJS Docker 图片 运行 我的应用程序(Alpine Linux 3.11,nodeJS v12.15.0),我最近需要将货币国际化应用
我注意到我的容器缺少语言环境,所以我需要安装 full-ICU。因此,我修改了基于 Alpine 的 Docker 图像以添加两行以安装 full-ICU:
RUN npm i -g full-icu
ENV NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu”
安装顺利,控制台输出:
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 数据文件是否在正确的位置。
问题
但是当在这个容器 (运行 docker run -ti myimage sh
) 中打开一个 shell 并使用 Intl 时,我注意到只有在 运行 时语言环境才能正常工作使用 --icu-data-dir 选项的节点,而不是在使用 NODE_ICU_DATA 环境变量时。
但是,出于各种原因,我肯定更喜欢环境变量,所以我希望它能工作。
到目前为止的测试
这是我使用 node
进行的测试:
node --icu-data-dir=/home/node/.npm/lib/node_modules/full-icu
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'enero'
它说的是“enero”,所以它在工作。这意味着完整的 ICU 已正确安装并且可以访问。
export NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu”
node
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'January'
它不关心我的环境变量(也试过将环境变量放在Docker文件中,如上所示)
env NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu” node
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 包
所以...
有人知道在环境变量中指定路径不起作用的原因吗?我应该检查什么?
对于遇到此问题的任何人:问题是特定于版本的。
部署更新的 NodeJS 版本修复了这些 ICU 错误。
我在 VPS 上遇到了与 Plesk 相同的问题。
我无法更新 Node 版本,安装的 Node 版本是 v12.4.0.
在我的情况下,我也无法将 full-icu 安装为全局模块,并且进程管理器在没有 运行 package.json.
中的启动脚本的情况下启动我的应用程序
在我这种情况下,加载完整 icu 支持的唯一方法是使用环境变量。
我首先通过命令行尝试:
export NODE_ICU_DATA=/full/path/of/my/app/node_modules/full-icu
然后
-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'
>
它工作正常。
如果我 运行 在我的应用程序的根文件夹中执行此命令,它也会起作用:
NODE_ICU_DATA=node_modules/full-icu /opt/plesk/node/12/bin/node
所以我在应用程序节点设置上添加了一个 ENV var(在 Plesk 中)
NODE_ICU_DATA
具有价值
node_modules/full-icu
重新启动应用程序 i18n 支持正常工作。
我希望这可以帮助其他人有同样的情况。
情况
我有一个 Alpine/NodeJS Docker 图片 运行 我的应用程序(Alpine Linux 3.11,nodeJS v12.15.0),我最近需要将货币国际化应用
我注意到我的容器缺少语言环境,所以我需要安装 full-ICU。因此,我修改了基于 Alpine 的 Docker 图像以添加两行以安装 full-ICU:
RUN npm i -g full-icu
ENV NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu”
安装顺利,控制台输出:
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 数据文件是否在正确的位置。
问题
但是当在这个容器 (运行 docker run -ti myimage sh
) 中打开一个 shell 并使用 Intl 时,我注意到只有在 运行 时语言环境才能正常工作使用 --icu-data-dir 选项的节点,而不是在使用 NODE_ICU_DATA 环境变量时。
但是,出于各种原因,我肯定更喜欢环境变量,所以我希望它能工作。
到目前为止的测试
这是我使用 node
进行的测试:
node --icu-data-dir=/home/node/.npm/lib/node_modules/full-icu
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'enero'
它说的是“enero”,所以它在工作。这意味着完整的 ICU 已正确安装并且可以访问。
export NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu”
node
Welcome to Node.js v12.15.0.
Type ".help" for more information.
> new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8));
'January'
它不关心我的环境变量(也试过将环境变量放在Docker文件中,如上所示)
env NODE_ICU_DATA=“/home/node/.npm/lib/node_modules/full-icu” node
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
.
所以...
有人知道在环境变量中指定路径不起作用的原因吗?我应该检查什么?
对于遇到此问题的任何人:问题是特定于版本的。
部署更新的 NodeJS 版本修复了这些 ICU 错误。
我在 VPS 上遇到了与 Plesk 相同的问题。 我无法更新 Node 版本,安装的 Node 版本是 v12.4.0.
在我的情况下,我也无法将 full-icu 安装为全局模块,并且进程管理器在没有 运行 package.json.
中的启动脚本的情况下启动我的应用程序在我这种情况下,加载完整 icu 支持的唯一方法是使用环境变量。
我首先通过命令行尝试:
export NODE_ICU_DATA=/full/path/of/my/app/node_modules/full-icu
然后
-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'
>
它工作正常。
如果我 运行 在我的应用程序的根文件夹中执行此命令,它也会起作用:
NODE_ICU_DATA=node_modules/full-icu /opt/plesk/node/12/bin/node
所以我在应用程序节点设置上添加了一个 ENV var(在 Plesk 中)
NODE_ICU_DATA
具有价值
node_modules/full-icu
重新启动应用程序 i18n 支持正常工作。
我希望这可以帮助其他人有同样的情况。