@alicloud/credentials 的天坑
因为想做一个阿里云服务器的监控,项目依赖了 @alicloud/ecs20140526 拉取阿里云ECS的信息,然后该组件依赖了 @alicloud/openapi-client,然后通过该依赖间接依赖了 @alicloud/credentials。
在本地调试时,没有使用 webpack 将代码打包成一个独立的 index.js 文件,貌似运行一切正常,但在准备部署到线上时,发现怎么都启动不起来。
经过排查发现 @alicloud/credentials 中有一段写死的读取 package.json 的代码。
// @alicloud\credentials\src\util\helper.ts
import * as os from 'os';
import kitx from 'kitx';
import path from 'path';
const pkg = kitx.loadJSONSync(path.join(__dirname, '../../package.json'));
export const DEFAULT_UA = `AlibabaCloud (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>o</mi><mi>s</mi><mi mathvariant="normal">.</mi><mi>p</mi><mi>l</mi><mi>a</mi><mi>t</mi><mi>f</mi><mi>o</mi><mi>r</mi><mi>m</mi><mo stretchy="false">(</mo><mo stretchy="false">)</mo></mrow><mo separator="true">;</mo></mrow><annotation encoding="application/x-tex">{os.platform()};</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">os</span><span class="mord">.</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mclose">)</span></span><span class="mpunct">;</span></span></span></span>{os.arch()}) ` +
`Node.js/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>p</mi><mi>r</mi><mi>o</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi mathvariant="normal">.</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mi>C</mi><mi>o</mi><mi>r</mi><mi>e</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">{process.version} Core/</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">ocess</span><span class="mord">.</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">e</span><span class="mord">/</span></span></span></span>{pkg.version}`;
export const DEFAULT_CLIENT = `Node.js(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>p</mi><mi>r</mi><mi>o</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi mathvariant="normal">.</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mo stretchy="false">)</mo><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">{process.version}),</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">ocess</span><span class="mord">.</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span></span><span class="mclose">)</span><span class="mpunct">,</span></span></span></span>{pkg.name}: ${pkg.version}`;
简直是天坑。因为打包成一个文件后,__dirname 就是代码执行的根目录,而所有的代码也都在根目录的 index.js 中,压根不会再向上找两级目录。
只好等空了通过 webpack-loader 魔改一下了,搞不懂为什么阿里云的研发会写这种代码。
注,本文作成时,@alicloud/credentials 的版本号为 2.2.0