依赖管理器 (dependencyManager)

依赖管理器模块负责安装自动导入所需的依赖包,包括 unplugin-auto-import、unplugin-vue-components 和选择的组件库。

API 参考

installDependencies

安装必要的依赖包。

函数签名

1async function installDependencies(
2  library: Library,
3  projectPath: string,
4  packageManager: PackageManager = "npm"
5): Promise<void>;

参数

  • library: 要配置的组件库,类型为 Library
  • projectPath: 项目路径,字符串类型
  • packageManager: 包管理器,类型为 PackageManager,默认为 "npm"

返回值

  • Promise<void>: 安装完成的 Promise

示例

1import { installDependencies } from "ew-auto-import-tool";
2
3async function installDeps() {
4  try {
5    await installDependencies("element-plus", "/path/to/project", "yarn");
6    console.log("依赖安装成功!");
7  } catch (error) {
8    console.error("依赖安装失败:", error);
9  }
10}
11
12installDeps();

实现细节

installDependencies 函数根据选择的组件库和包管理器,安装必要的依赖包。

安装的依赖

对于每个支持的组件库,会安装以下依赖:

  • unplugin-auto-import - 用于自动导入 API
  • unplugin-vue-components - 用于自动导入组件
  • 选择的组件库(如 element-plus、ant-design-vue 等)

支持的包管理器

  • npm - 使用 npm install 命令
  • yarn - 使用 yarn add 命令
  • pnpm - 使用 pnpm add 命令

组件库配置

每个组件库的配置定义在 LIBRARY_CONFIGS 对象中,包含以下信息:

1interface LibraryConfig {
2  dependencies: string[]; // 需要安装的依赖
3  resolverImport: string; // 解析器导入语句
4  resolverName: string; // 解析器名称
5}

例如,Element Plus 的配置如下:

1{
2  dependencies: [
3    "element-plus",
4    "unplugin-auto-import",
5    "unplugin-vue-components"
6  ],
7  resolverImport: 'import { ElementPlusResolver } from "unplugin-vue-components/resolvers";',
8  resolverName: "ElementPlusResolver"
9}

源码分析

1export async function installDependencies(
2  library: Library,
3  projectPath: string,
4  packageManager: PackageManager = "npm"
5): Promise<void> {
6  const libraryConfig = LIBRARY_CONFIGS[library];
7
8  if (!libraryConfig) {
9    throw new Error(`不支持的组件库: ${library}`);
10  }
11
12  const dependencies = libraryConfig.dependencies;
13
14  // 构建安装命令
15  const installCmd = packageManager === "npm" ? "install" : "add";
16  const args = [installCmd, ...dependencies, "--save"];
17
18  // 执行安装命令
19  return new Promise((resolve, reject) => {
20    const child = spawn(packageManager, args, {
21      cwd: projectPath,
22      stdio: "inherit",
23      shell: true,
24    });
25
26    child.on("close", (code) => {
27      if (code !== 0) {
28        reject(new Error(`依赖安装失败,退出码: ${code}`));
29      } else {
30        resolve();
31      }
32    });
33
34    child.on("error", (err) => {
35      reject(new Error(`依赖安装失败: ${err.message}`));
36    });
37  });
38}

该函数使用 Node.js 的 child_process.spawn 方法执行包管理器命令,安装必要的依赖包。根据检测到的包管理器类型,使用不同的安装命令。