@alicloud/credentials 的天坑

发布于:12/6/2021, 6:18:15 PM @孙博
技术分享 | 阿里云
许可协议:署名-非商业性使用(by-nc)

因为想做一个阿里云服务器的监控,项目依赖了 @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 (${os.platform()}; ${os.arch()}) ` +
    `Node.js/${process.version} Core/${pkg.version}`;

export const DEFAULT_CLIENT = `Node.js(${process.version}), ${pkg.name}: ${pkg.version}`;

简直是天坑。因为打包成一个文件后,__dirname 就是代码执行的根目录,而所有的代码也都在根目录的 index.js 中,压根不会再向上找两级目录。


只好等空了通过 webpack-loader 魔改一下了,搞不懂为什么阿里云的研发会写这种代码。

注,本文作成时,@alicloud/credentials 的版本号为 2.2.0