{"id":18262883,"url":"https://github.com/midwayjs/light-generator","last_synced_at":"2025-04-04T20:30:57.923Z","repository":{"id":35069626,"uuid":"202500049","full_name":"midwayjs/light-generator","owner":"midwayjs","description":"a light generator for generate a boilerplate","archived":false,"fork":false,"pushed_at":"2022-01-29T13:19:53.000Z","size":89,"stargazers_count":15,"open_issues_count":1,"forks_count":4,"subscribers_count":20,"default_branch":"master","last_synced_at":"2024-04-23T20:15:17.402Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/midwayjs.png","metadata":{"files":{"readme":"README.md","changelog":"History.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-15T08:04:13.000Z","updated_at":"2024-03-21T03:29:57.000Z","dependencies_parsed_at":"2022-08-08T04:16:06.830Z","dependency_job_id":null,"html_url":"https://github.com/midwayjs/light-generator","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Flight-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Flight-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Flight-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Flight-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/midwayjs","download_url":"https://codeload.github.com/midwayjs/light-generator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247246202,"owners_count":20907751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T11:09:07.558Z","updated_at":"2025-04-04T20:30:55.734Z","avatar_url":"https://github.com/midwayjs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# light generator\n\n一个非常轻量的脚手架生成器，用于各种脚手架的生成。\n\n核心功能：\n\n- 获取模板到本地（支持本地模板，github 地址，或者npm 地址）\n- 拷贝到指定的用户路径\n- 执行自定义规则（比如替换文件名等）\n\n在很多时候，我们希望自己的模板在不同的脚手架（CLI）工具中都能够调用，基于这个需求，我们开发了比较轻量级的生成器，可以嵌入到不同的脚手架工具中。\n\n这个包只提供生成模板的能力和所希望的 API，外部可以对接不同的 CLI 工具。\n\n## Quick Guide\n\n```ts\nimport {LightGenerator} from 'light-generator';\n\nconst generator = new LightGenerator().defineNpmPackage({\n  npmPackage: 'egg-boilerplate-simple',\n  targetPath,\n  npmInstall: true,\n});\n\nawait generator.run({\n  name: 'demo'\n});\n```\n\n默认会将模板中的下划线前缀的文件替换为正常文件名，并替换模板中的 `{{xxx}}` 变量为传入的参数。\n\n## LightGenerator\n\n### Constructor\n\n- options {object}\n    - disableDefaultRule {boolean} 可选，默认 false，用于禁止默认规则;\n    - rules { CopyRule[] } 可选，可以通过这个配置，传递自定义拷贝规则\n\n### API\n\n`LightGenerator` 通过定义一系列格式，返回一个特定格式的生成器，执行该生成器即可拿到相应的结果。\n\n```ts\ninterface LightGenerator {\n  defineLocalPath(options): CommonGenerator;\n  defineNpmPackage(options): CommonGenerator;\n}\n\ninterface CommonGenerator {\n  async getParameterList(): object;\n  async run(replaceParameter?: object);\n}\n```\n\n- getParameterList() 获取该生成器（模板）定义的用户可覆盖的配置\n- run() 执行该生成器，在这个时候传入用户覆盖的配置\n\n#### defineLocalPath\n\n生成本地路径的模板\n\n- options {object}\n    - templatePath { string } 本地模板路径\n    - targetPath { string } 需要拷贝到的目录\n\n**示例**\n\n```ts\nconst localGenerator = new LightGenerator().defineLocalPath({\n  templatePath: join(__dirname, './fixtures/boilerplate-2'),\n  targetPath\n});\n```\n\n#### defineNpmPackage\n\n生成一个 npm 包资源类型的模板\n\n- options {object}\n    - npmPackage { string } npm 包名\n    - targetPath { string } 需要拷贝到的目录\n    - npmClient { string } 可选，默认为 npm\n\n**示例**\n\n```ts\nconst npmGenerator = new LightGenerator().defineNpmPackage({\n  npmPackage: 'egg-boilerplate-simple',\n  targetPath\n});\n```\n\n#### clean cache\n\n由于本模块会下载 npm 包到本地特定的临时目录，可以通过暴露的方法清理该目录。\n\n注意，此方法为静态方法。\n\n```ts\nawait LightGenerator.cleanCache();\n```\n\n\n## Add custom copy rule\n\n生成器可以在生成完模板文件后，做一些自定义的操作，比如替换内容，修改文件名等。\n\n简单的来说，规则是一个函数，参数为当前文件路径，用于对当前文件进行操作。\n\n**示例**\n\n```ts\nimport {LightGenerator} from 'light-generator';\n\nconst customRule = async (currentFilePath) =\u003e {\n  // TODO\n}\n\nconst generator = new LightGenerator({\n  rules: [customRule]\n});\n```\n\n内置了一些默认规则，比如\n\n- ignoreRule： 用于一些可能会被忽略的文件，在模板文件前缀加入下划线（_），执行此规则会移除该下划线\n- replaceRule: 用于将变量替换掉带 {{}} 的文本内容，或者文件名\n\n这些规则默认已经内置，并且生效。\n\n**示例**\n\n```ts\nimport {LightGenerator, ignoreRule} from 'light-generator';\nconst generator = new LightGenerator({\n  rules: [ignoreRule]\n});\n```\n\n如果不希望这些规则生效，请在初始化时关闭，并自行传递规则。\n\n**示例**\n\n```ts\nimport {LightGenerator, ignoreRule} from 'light-generator';\nconst generator = new LightGenerator({\n  disableDefaultRule: true,\n  rules: [ignoreRule]\n});\n```\n\n## 模板规则\n\n默认情况下，会拷贝整个模板目录的内容到目标目录，但是在 `package.json` 中加入 `boilerplateConfig` 段落可以额外配置这个行为。\n\n```json\n{\n  \"boilerplateConfig\": {\n    \"root\": \"template\",\n    \"replaceParameter\": \"index.js\",\n    \"replaceFile\": [\n      \"src/index.ts\"\n    ],\n    \"rule\": []\n  }\n}\n```\n\n也可以支持通配符\n\n```json\n{\n  \"boilerplateConfig\": {\n    \"root\": \"template\",\n    \"replaceParameter\": \"index.js\",\n    \"replaceFile\": [\n      \"*.ts\"\n    ]\n  }\n}\n```\n\n参数\n\n- root { string } 设置模板根路径，相对于包根路径，如果配置了 `boilerplateConfig` 字段，默认为 `boilerplate` 目录\n- replaceParameter { string } 用户可替换参数文件路径，相对于包根路径，默认为 `index.js`\n- replaceFile { string []} 需要替换的文件列表，默认为 `README.md`，相对于 root，请一定填写规则修改前的文件名，支持 [minimatch](https://github.com/isaacs/minimatch) 格式的通配符\n- rule { string []} 只对本模板生效自定义 copy 规则，内容为可以 require 的地址，内容格式为 `module.exports = async () =\u003e {}`\n- beforeAll { string } 模板创建执行之前会执行的代码地址，内容为可以 require 的地址，如果内容为方法，则参数为 options\n  - options\n      - sourceRoot 模板源根路径，比如本地下载的地址\n      - templateRoot 模板源路径，比如下载到本地的模板里面的 boilerplate 目录\n      - targetRoot 目标路径，实际拷贝到的地址\n      - replaceParameter 用户替换的参数\n      - templateConfig pkg 中定义的 `boilerplateConfig` 配置内容\n- afterAll { string } 所有拷贝都完成之后会执行代码地址，内容为可以 require 的地址，如果内容为方法，则参数为 options，同 beforeAll\n\n## 事件\n\n```js\nconst generator = new LightGenerator().defineNpmPackage({\n  npmPackage: 'egg-boilerplate-simple',\n  targetPath\n});\n\n/**\n * 模板下载完毕，准备创建\n */\ngenerator.onTemplateReady(() =\u003e {\n  // log\n});\n\n/**\n * 每个文件被拷贝时触发\n */\ngenerator.onFileCreated((data: {\n  sourceFullFilePath: string;\n  targetFullFilePath: string;\n  destDir: string;\n  relativeFilePath: string;\n}) =\u003e {\n  // log\n});\n\nawait generator.run({\n  name: 'demo'\n});\n```\n\n- sourceFullFilePath 源模板文件绝对路径\n- targetFullFilePath 要拷贝的目标绝对路径\n- destDir 要拷贝的目标目录\n- relativeFilePath 要拷贝的目标文件\n\n## 其他\n\n此模块部分核心代码从 serverless 模块中抽取。\n\n## 协议\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidwayjs%2Flight-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmidwayjs%2Flight-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidwayjs%2Flight-generator/lists"}