尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

degit 使用指南:从 CLI 到 ESM API 再到 degit.json 动作的项目脚手架全解析

发布时间:2026/9/27 9:18:32

资讯中心
01
ARTICLE

degit 使用指南:从 CLI 到 ESM API 再到 degit.json 动作的项目脚手架全解析

degit 使用指南:从 CLI 到 ESM API 再到 degit.json 动作的项目脚手架全解析
开发工具CLI【免费下载链接】degitStraightforward project scaffolding项目地址https://gitcode.com/gh_mirrors/de/degit点击查看免费下载degit是一个直接了当的项目脚手架工具给定user/repo它会解析该仓库的最新提交、下载对应的 tar 快照并解压到目标目录全程不拉取完整 git 历史也不在你的新项目里留下模板的.git目录。本文以官方使用文档 docs/USAGE.md 为主体结合仓库源码src/domain/repo.ts、src/core/orchestrator.ts、src/bin.ts 等逐层讲解 CLI 全部命令与选项、ESM 编程接口、degit.json后置动作并说明它与git clone --depth 1的本质差异。读完本文你将能熟练地用 degit 拉取任意公开仓库模板、按需过滤文件、使用别名与缓存并把它嵌入到自己的 Node.js 工具链中。快速开始把某个 GitHub 仓库的默认分支下载到当前目录degit user/repo下载到一个新文件夹degit user/repo my-new-project只下载指定文件用逗号分隔degit user/repo my-project --files README.md,src/index.ts使用指定 tag、分支或 commit#ref语法degit user/repo#v1.0.0以上四条命令涵盖了 degit 最核心的使用形态源仓库、目标目录、文件过滤、引用锁定。完整的参数语义在下面CLI 参考一节展开。安装与运行环境npm install -g degitdegit要求Node.js 20 或更高版本见 package.json 中的engines字段。安装完成后直接运行degit即可。CLI 参考基本语法degit src[#ref] [dest] [options]src要复制的仓库支持多种写法见下文支持的源。dest解压目标目录省略时使用当前目录。options可选参数见下方选项表。从源码看参数解析由 src/bin.ts 中的parseCliArgs完成它使用mri解析process.argv并把短选项c/f/F/m/r/v/V分别映射为cache/force/files/mode/repo-name/verbose/version。支持的源degit支持 GitHub、GitLab、Bitbucket 和 Sourcehut 四种托管平台。以 src/domain/repo.ts 中的providerDomains映射为准各平台域名分别为github.com、gitlab.com、bitbucket.org、git.sr.ht。GitHubdegit user/repo degit github:user/repo degit https://github.com/user/repo degit gitgithub.com:user/repoGitLabdegit gitlab:user/repo degit https://gitlab.com/user/repo degit gitgitlab.com:user/repo对于自托管 GitLab 实例使用gitlab://协议degit gitlab://git.example.com/user/repogitlab://的解析逻辑见 src/domain/repo.tsgitlab://后的第一段被当作自定义域名customDomain其余部分作为项目路径。Bitbucketdegit bitbucket:user/repo degit https://bitbucket.org/user/repo degit gitbitbucket.org:user/repoSourcehutdegit git.sr.ht/user/repo degit https://git.sr.ht/user/repo degit gitgit.sr.ht:user/repo指定 tag、分支或 commit在任意源后面追加#refdegit user/repo#dev # 分支 degit user/repo#v1.2.3 # 发布 tag degit user/repo#1234abcd # commit 哈希省略#ref时degit 解析仓库的默认分支。其底层实现在 src/core/orchestrator.tsgetHash()先通过 git 客户端fetchRefs()拉取远端引用列表selectRef()优先精确匹配 ref 名若选择器长度 ≥ 8 且无法精确匹配则退化为按 commit 哈希前缀匹配selectHead()用于HEAD解析优先查找类型为HEAD的引用其次回退到main/master分支最后兜底取第一个branch类型的引用。创建新文件夹省略dest时degit 解压到当前目录。目标目录必须为空除非使用--force。使用--repo-name短选项-r可以按仓库名自动创建目录degit user/repo my-new-project degit -r user/repo在 src/bin.ts 中可以看到dest的推导逻辑dest positionalDest ?? (args[repo-name] ? parse(resolvedSrc).name : .)即显式传入目录优先否则在-r时取解析后的仓库名其余情况取当前目录.。目录非空的检查实现在 src/operations/filesystem.ts 的checkDirIsEmpty()非空且未传force时抛出DEST_NOT_EMPTY错误并提示Use options.force to override。克隆子目录把子目录直接拼到源路径末尾degit user/repo/subdirectory也可以直接粘贴完整的 GitHub 网页 URLdegit https://github.com/user/repo/tree/main/subdirectoryGitHub 网页 URL 中的/tree/ref/subdir或/blob/ref/subdir会被解析为 ref 与子目录见 src/domain/repo.ts 的parseWebPath()GitLab 使用/-/tree/ref/subdir标记Bitbucket 使用/src/ref/subdirSourcehut 使用/tree/ref/subdir。对于GitLab 嵌套组degit 会先尝试user/repo两段式解读失败后把整个路径当作嵌套组项目处理。该逻辑由 src/core/orchestrator.ts 的tryGitlabProject()与 src/domain/repo.ts 的generateGitlabRepoCandidates()共同实现后者按段切分路径生成一组候选 Repouser、name、subdir各不相同前者依次尝试克隆只有MISSING_REF或COULD_NOT_FETCH这类可重试错误才继续尝试下一个候选。克隆指定文件只保留特定文件或目录时使用--files短选项-F。路径之间用逗号分隔或重复使用该选项degit user/repo my-project --files README.md,src/index.ts degit user/repo my-project -F README.md -F src/index.tsCLI 侧的-F支持逗号分隔与重复传参其规范化逻辑见 src/bin.ts 的normalizeFiles()。执行时的文件保留实现在 src/operations/filesystem.ts 的keepFiles()不存在的路径或解析后超出目标目录的路径会被跳过并发出警告如果没有任何请求的路径被解析到则保留整个目标目录警告NO_FILES_MATCHED递归剪枝时请求的目录会连同其下所有内容一起保留空目录会被清理。选项一览选项短选项说明--help-h显示帮助文本。--version-V显示版本号。--cache-c只使用本地缓存不访问网络。--force-f允许克隆到非空目标目录。--files paths-F paths只保留列出的文件或目录。--repo-name-r克隆到以仓库名命名的目录。--verbose-v打印额外的进度信息。--mode mode-mtar默认或git。--modegit为兼容而保留但会打印弃用提示。运行degit --help可以查看发布的完整帮助文本仓库中对应 assets/help.md。mode的取值在 src/domain/types.ts 中被限定为tar或git二选一非法值会在 src/core/orchestrator.ts 抛出Valid modes are tar, git错误。缓存机制degit 会把下载的 tar 快照缓存到平台对应的目录Linux/BSD$XDG_CACHE_HOME/degit或~/.cache/degitmacOS~/Library/Caches/degitWindows%LOCALAPPDATA%\degit或~/AppData/Local/degit缓存目录的解析实现在 src/shared/utils.ts 的resolveBase()中缓存根路径由base常量导出。缓存结构上每个仓库对应一个目录内含map.jsonref 到 commit 哈希的映射access.json各 ref 最近访问时间戳供交互模式按最近使用排序hash.tar.gz按 commit 哈希命名的归档文件。读写逻辑见 src/transports/tar/cache.tsreadCachedRefs()读取map.jsonupdateCache()更新access.json、map.json并在哈希变化时清理旧的.tar.gz文件。默认情况下degit 会先从网络解析最新 ref若网络不可达则回退到缓存版本使用--cache则完全跳过网络请求只用本地缓存。这一点在 src/transports/tar/archive.ts 的resolveArchiveHash()中体现得最清楚cache为真时直接调用getHashFromCache()否则走getHash()在线解析。私有仓库私有仓库会被自动处理。degit默认尝试 HTTPS tarball 路径当无法获取或解压快照时回退到 SSH 克隆。SSH/私有仓库仍然要求本地PATH中存在git。回退逻辑见 src/core/orchestrator.ts 的shouldFallbackToGit()只有当错误码为COULD_NOT_DOWNLOAD且未开启--cache时才触发回退src/transports/tar/archive.ts 中当源的传输方式为 SSH 时tar 查询失败也会直接回退到 git 克隆。HTTPS 代理如果设置了https_proxy环境变量degit 在拉取 tar 归档时会使用该代理。实现上src/core/orchestrator.ts 在构造时读取process.env.https_proxy存入this.proxy下载时传给FetchFnsrc/shared/utils.ts 的默认fetch在存在代理时通过https-proxy-agent建立请求并自动处理 3xx 重定向与 4xx/5xx 错误响应。别名Aliases保存一个别名degit alias github:user/repo myRepo使用别名degit myRepo管理别名degit unalias myRepo degit ls # 列出已保存的别名别名存储在 degit 缓存目录下的aliases.json中。其实现见 src/aliases.tssaveAlias()/removeAlias()负责读写aliases.jsonloadAliases()返回全部别名resolveAlias()用于在解析源之前做替换。CLI 入口 src/bin.ts 中alias、unalias、ls三个子命令会被最先识别并分发到对应处理函数普通克隆前会先loadAliases()resolveAlias()完成替换ESM 侧则在 src/core/orchestrator.ts 的构造函数中解析。交互模式不带任何参数运行degit会启动交互式选择器依次提示输入源仓库、目标目录、是否使用缓存如果目标目录非空还会询问是否覆盖。交互实现见 src/bin.ts源仓库的候选列表来自缓存中所有map.json的条目并按access.json记录的最近访问时间排序支持模糊搜索fuzzysearch覆盖确认通过 enquirer 的 toggle 完成用户拒绝时输出! Directory not empty — aborting。ESM APIdegit 也可以在 Node.js 脚本中以编程方式使用。基础示例import degit from degit; const emitter degit(user/repo, { cache: true, force: true, verbose: true, }); emitter.on(info, (info) { console.log(info.message); }); emitter.on(warn, (info) { console.warn(info.message); }); await emitter.clone(path/to/dest); console.log(done);degit的默认导出在 src/index.ts 中定义export default function degit(src, opts) { return new Degit(src, opts); }即每次调用都会创建一个 src/core/orchestrator.ts 中定义的Degit实例继承自EventEmitter。clone()的完整流程src/core/orchestrator.ts为检查目标目录是否为空 → 克隆到目标目录 → 按需保留文件 → 发出SUCCESS事件 → 执行degit.json动作。构造参数参数类型说明aliasesRecordstring, string解析src时使用的别名映射表。cacheboolean只使用本地缓存不访问网络。fetchFetchFn自定义(url, dest, proxy?) Promisevoid下载函数。filesstring[]只保留列出的文件或目录。forceboolean允许克隆到非空目标目录。gitGitClient自定义 git 客户端用于 ref 解析与回退克隆。modetar \| git克隆模式tar为默认。verboseboolean打印额外的进度信息。各选项的类型定义见 src/domain/types.ts 的ConstructorOptions。其中fetch允许你完全替换网络下载逻辑默认实现是 src/shared/utils.ts 的fetchgit允许替换 ref 解析与克隆的 git 客户端默认实现是 src/transports/git/client.ts这在测试与离线场景中尤其有用。事件Degit实例emitter暴露两个事件通道info—— 进度与成功消息如cloned user/repo#ref to dest、using cached commit hash ...warn—— 非致命问题如跳过的路径、回退提示、未定义的替换环境变量。事件对象至少包含message还可能包含code、dest、repo、url、ref、subdir等字段。事件对象的类型定义见 src/domain/types.ts 的EventInfo可用的code值包括SUCCESS、USING_CACHE、DEST_NOT_EMPTY、REMOVED、NO_FILES_MATCHED、GLOB_NOT_ALLOWED等src/domain/types.ts。degit.json 动作初始克隆完成后degit 会在目标目录顶层查找degit.json文件并执行其中定义的动作。该文件在 src/shared/utils.ts 中定义为常量degitConfigName degit.json读取逻辑在 src/operations/filesystem.ts 的getDirectives()文件必须存在且内容为数组读取后会立即删除该文件fs.unlinkSync再交由 src/operations/directives.ts 的applyDirectives()逐个执行。针对编辑器自动补全与校验仓库提供了一份 JSON Schemaschemas/degit.schema.json。clone克隆另一个仓库到目标目录保留已有文件[ { action: clone, src: user/another-repo }, { action: clone, src: user/another-repo, files: [README.md, src/index.ts] } ]clone 动作还支持cache使用缓存版本与verbose输出额外信息两个可选字段见 Schema 中clone的定义。被克隆的仓库也可以定义自己的degit.json动作嵌套执行。实现上src/operations/directives.ts 的cloneDirective()会先用stashFiles()把目标目录现有内容暂存到缓存目录下的临时位置再以force: true创建子Degit实例克隆新仓库全部动作结束后由unstashFiles()恢复原有文件——这正是保留已有文件的实现原理src/shared/utils.ts。search_replace在列出的文件中把正则表达式的每一次匹配替换为指定内容。replacement字段是环境变量的名字其值被用作替换字符串[ { action: search_replace, files: [package.json, README.md], pattern: \\{\\{project_name\\}\\}, replacement: PROJECT_NAME } ]执行时src/operations/directives.ts从process.env[action.replacement]读取替换值若该环境变量未定义动作被跳过并发出警告使用new RegExp(pattern, gu)编译模式全局 Unicode 模式若环境变量定义了但目标文件不存在、是目录或解析后超出目标目录均跳过并警告实际内容替换发生在replaceFile()替换后文件内容有变化才计入统计并通过info事件报告替换的文件数量与文件名。files可以是单个路径或路径数组路径相对于目标目录解析超出目标目录的路径会被跳过。remove删除一个或多个文件[ { action: remove, files: [LICENSE] } ]files条目支持 glob 模式这样无需逐个列出即可删除整类文件。由于 glob 可能匹配到比预期更多的文件只有显式设置allowGlobs: true时才会处理 glob 模式src/operations/filesystem.ts 的isGlobPattern()用于检测* ? { } [ ]等字符src/operations/filesystem.ts 的removeFiles()在allowGlobs未开启时会发出GLOB_NOT_ALLOWED警告并跳过[ { action: remove, files: [.github/**/*.md], allowGlobs: true } ]removeFiles()会校验每个待删路径都解析在目标目录之内safeResolve() 符号链接真实路径检查超出目标目录的路径会被跳过并警告删除目录时按深度优先排序确保子目录先于父目录删除。为什么不用git clone --depth 1几个关键差异git clone会在你的新项目里留下属于模板的.git目录很容易忘记重新初始化仓库degit 只解压快照不会留下.git。degit 会缓存归档文件首次下载后可以离线使用。输入更少degit user/repo对比git clone --depth 1 ssh://gitgithub.com/user/repo。通过degit.json支持可组合的后置动作clone、search_replace、remove。内置对子目录、文件过滤和别名的支持。更多参考README.md —— 项目概览与快速开始docs/ARCHITECTURE.md —— 仓库架构与数据流docs/CONTRIBUTING.md —— 贡献与开发工作流assets/help.md —— 发布的 CLI 帮助文本schemas/degit.schema.json ——degit.json动作的 JSON Schema赞分享开发工具CLI【免费下载链接】degitStraightforward project scaffolding项目地址https://gitcode.com/gh_mirrors/de/degit点击查看免费下载相关推荐degit 项目脚手架工具实战指南从快照下载到 degit.json 后置动作的完整解析degit 项目脚手架工具实战指南从快照下载到 degit.json 后置动作的完整解析 本指南围绕 degit 这一直接了当的项目脚手架straigh开发工具CLIdegit 完整命令行手册从仓库源解析、缓存回退到 degit.json 动作编排degit 完整命令行手册从仓库源解析、缓存回退到 degit.json 动作编排 导读本文是 degitstraightforward project开发工具CLITaiga Docker生产环境部署Nginx代理与安全配置最佳实践Taiga Docker生产环境部署Nginx代理与安全配置最佳实践 Taiga是一款功能强大的开源项目管理工具通过Docker部署可以快速搭建稳定的生产环运维DevOps容器编排上一篇游戏自动化革命从时间消耗者到效率掌控者下一篇BACnet4J纯Java实现的智能建筑通信协议完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。