Context
简介
Context 是 pkgs 的上下文,挂载了多种实例用于处理文件。例如 version、publish 和 run 都使用到了上下文中的 git和包处理等能力
类型
ts
class Context {
constructor(config: ExecuteCommandConfig, argv?: string[], args?: any[], ttArgv?: string[])
// 配置
config: ExecuteCommandConfig
// 图表依赖
contextAnalysisDiagram: ContextAnalysisDiagramApi
// 文件仓库
fileStore: FileStoreApi
// 包管理器
packageManager: ManagerApi
// 命令管理
executeManage: ExecuteApi
// NodeJS.Process['argv']
argv: ContextParams['argv']
// 处理后的命令,从中获取插件定义的命令
args: ContextParams['args']
// 一般要先启用allowUnknownOption,用来将插件非定义的民乐参数透传
ttArgv: ContextParams['ttArgv']
// cli命名,例如用来读取配置文件
static cli: Agent
// 创建上下文实例
static create({ config, git, argv, args, ttArgv }: ContextParams): Promise<Context>
// 配置合并
static assignConfig(...config: ExecuteCommandCli[]): Promise<ExecuteCommandConfig>
// 获取默认配置
static getDefault(config?: ContextParams['config']): Promise<ExecuteCommandConfig>
// 获取处理后的args
get argvValue(): string[]
// 配置合并
assignOptions(...config: ExecuteCommandCli[]): this
}
属性
config
配置
描述
混合多方配置生成
项目配置文件 + 包管理器配置 + 默认配置 = config
优先级:项目配置文件 > 包管理器配置 > 默认配置
类型
contextAnalysisDiagram
依赖图表
描述
寻找包,并且对包依赖进行分析
类型
ts
interface ContextAnalysisDiagramApi {
// 工作区
packagesPath: ExecuteCommandConfig['packagesPath']
// 图表依赖
analysisDiagram: AnalysisDiagram
get allDirs(): string[] // 获取所有包地址
get allFilesPath(): string[] // 获取所有包package.json地址
get allPackagesJSON(): IPackageJson<unknown>[] // 获取所有包的package.json
initData(): Promise<this> // 初始化图表依赖
// 获取依赖我的包目录(例如测试的时候,需要对直接和间接依赖了当前包的包也进行测试,才能确定是否影响
getRelyMyDir(forCD: (cd: (source: AnalysisBlockItem) => void) => Promise<void>): Promise<string[]>
// 通过文件路径获取包目录
getRelatedPackagesDir(files: string[] | boolean | undefined): string[]
// 获取我依赖的包目录(拓扑排序,例如构建之前,需要先构建我依赖的包,从而才能正确构建本身,不然我依赖的包如果没有构建物,会导致构建失败
getMyRelyDir(dirs: string[]): string[]
// package.json交换包信息
packageJsonToAnalysisBlock(value: IPackageJson): AnalysisBlockItem | null
// 目录交换包信息
dirToAnalysisBlock(value: string): AnalysisBlockItem | null
}
// 包名: AnalysisBlockItem
type AnalysisDiagram = Record<string, AnalysisBlockItem>
interface AnalysisBlockItem {
packageJson: IPackageJson // 包 package.json
name: string // 包名
filePath: string // 包 package.json 路径
dir: string // 包目录路径
relyMyDir: string[] // 依赖我的包
myRelyDir: string[] // 我依赖的包
}
fileStore
文件仓库
描述
基于 git 和图表依赖通过多种方式处理文件,模式:diff、sync,git:工作区、暂存区、版本区
类型
ts
interface FileStoreApi {
// 图表依赖实例
contextAnalysisDiagram: ContextAnalysisDiagramApi
// git实例
git: SimpleGit
// 获取所有包路径
getAllFile(): string[]
// 获取工作区包路径
workDiffFile(): Promise<string[]>
// 获取暂存区包路径
stageDiffFile(): Promise<string[]>
// 获取版本区diff模式包路径
repositoryDiffFile(separator?: string): Promise<string[]>
// 获取版本区sync模式包路径
repositorySyncFile(separator?: string): Promise<string[]>
// sync模式循环版本区
forRepositorySyncPack(callback: ForPackCallback, separator?: string): Promise<void>
// diff模式循环版本区
forRepositoryDiffPack(callback: ForPackCallback, separator?: string): Promise<void>
}
packageManager
包管理器
描述
实现包管理器的一些命令行为
类型
ts
interface ManagerApi {
// npm、pnpm之类
agent: AgentType
// 获取包工作区配置
getConfig(): Promise<ExecuteCommandCli>
// 例如:npm run [cmd]
run(cmd: string, args?: string[], options?: Options): CommandResult
// 例如:npm publish
publish(
packageJson: IPackageJson<any>,
args?: string[], // 命令参数
options?: Options, // 触发命令方法的参数
): CommandResult
}
executeManage
命令管理
描述
用来执行各种命令
类型
ts
interface ExecuteApi {
// 录入命令数据
enterMainResult(commandMainResult: HandleMainResult): this
// 返回命令数据
getCommandData(): {
analysisBlockList: AnalysisBlockItem[]
commandData: CommandResult<any>[]
}
// 执行
execute(): Promise<any[]>
}