厌倦了不小心压缩构建产物吗?试试 “dnx zipsrc”!
Source: Dev.to
我们都有过这种经历。你需要快速把项目分享给同事,附在支持工单上,或上传到某处。你右键点击,选择 Compress to ZIP,然后……等。为什么这么慢?为什么文件有 500 MB?
哦,对了。你把 node_modules 给压缩了。或者 bin/obj。又或者那个巨大的 .nuget 缓存。
现在你必须手动排除文件夹,或者更糟糕的是,先把所有东西复制到新位置。原本只需要 5 秒的操作,变成了 5 分钟的折磨。
介绍 dnx zipsrc 🎉
dnx zipsrc 是一个智能的 CLI 工具,可创建仅包含你的源代码的 zip 压缩包。它会自动排除构建产出、依赖项以及其他你不想共享的制品。
最棒的是?使用 .NET 10 的新 dnx 命令,你甚至不需要先安装它!
dnx zipsrc
就这么简单。一个命令。你的源代码现在已整齐地打包成 zip 文件,随时可以共享。
工作原理
使用 .gitignore 的智能排除
dnx zipsrc 并不是重新发明轮子,而是直接利用你已有的 .gitignore 规则。如果你的项目中存在 .gitignore 文件,这些规则会被自动遵守。
没有 .gitignore?没问题!工具会回退到等同于 dotnet new gitignore 的合理默认设置,覆盖常见的模式,包括:
- C#/.NET –
bin/、obj/、*.user、*.suo、.vs/ - Node.js –
node_modules/、dist/、.cache/ - 以及更多 – 构建产出、IDE 文件、日志等。
它同样会尊重子目录中的 .gitignore 文件,并正确处理取反模式(如 !important-file.txt)。
底层实现基于 GitignoreParserNet,这是一款面向 .NET 的强大 .gitignore 解析库。
智能命名
不想为文件名费心?我也是。
当你运行 dnx zipsrc 且未指定输出名称时:
- 若文件夹中包含
.sln或.slnx文件,压缩包会以该解决方案的名称命名。 - 否则,使用文件夹名称。
如果 MyProject.zip 已经存在,工具会自动生成 MyProject (2).zip,而不是直接覆盖。
使用示例
压缩当前目录
dnx zipsrc
压缩指定目录
dnx zipsrc -d ./src/MyAwesomeApp
指定自定义输出名称
dnx zipsrc -d ./src/MyApp -n ./archives/MyAppSource
# Creates: ./archives/MyAppSource.zip
如果忘记添加 .zip 扩展名,系统会自动补上。
为什么使用 dnx 而不是 dotnet tool install?
.NET 10 引入了 dnx 命令,它可以让你在 无需先安装 .NET 全局工具的情况下运行它们。它会在一步完成下载、缓存并运行该工具。
这意味着:
- ✅ 不会把全局工具列表弄得凌乱
- ✅ 始终运行最新版本
- ✅ 在任何装有 .NET 10+ 的机器上立即可用
- ✅ 非常适合一次性任务,例如压缩源代码
如果你经常使用它,仍然可以采用传统方式安装:
dotnet tool install -g zipsrc
zipsrc -d ./MyProject
- 📧 电子邮件附件 – 分享干净的源代码,避免臃肿
- 🎫 支持工单 – 附加最小复现示例到错误报告
- 📚 教学 – 向学生分发入门项目
- 💾 快速备份 – 在大规模重构前归档你的工作
- 🤝 代码审查 – 与未在你仓库中的团队成员共享快照
“但等等,这不是已经存在了吗?”
你说得对!用于压缩源代码的工具并不新鲜。已有的选项包括:
- Zipper Extension – 一个可以压缩解决方案的 Visual Studio 插件
- dotnet-zip-source – 一个具有类似目标的 .NET 全局工具
那么为什么还要再创建一个工具呢?以下是我的动机:
- 命名约定与输出位置 – 现有工具往往带有主观的默认设置。我希望能够自行控制命名逻辑(自动使用解决方案文件名)以及精确的输出位置。
- 对重复运行不自动递增 –
dnx zipsrc会自动在文件名后追加(2)、(3)等后缀,这样就永远不会丢失之前的归档。 - 更好的默认忽略规则 – 当不存在
.gitignore时,一些工具的排除规则非常少。dnx zipsrc会回退到等同于dotnet new gitignore的完整默认规则。
这些看似细小的细节,但如果你一天要多次压缩项目,它们的影响会累积起来!
Requirements
- .NET SDK 10.0 或更高
立即开始!
准备好停止意外压缩 node_modules 吗?只需运行:
dnx zipsrc
在 GitHub 上查看项目:jsakamoto/dnx-zipsrc
从 NuGet 安装:zipsrc on nuget.org
有问题或反馈?在下方留言或在 GitHub 上打开 issue。祝压缩愉快! 🗜️
致谢
特别感谢 Guiorgy 创建 GitignoreParserNet。该库处理所有复杂的 .gitignore 解析,使我无需重新发明轮子。
`.gitignore` parsing logic, making it easy to build tools that respect ignore patterns correctly. Open source makes building tools like this so much easier! 🙏
*This article was written with the help of VS Code and GitHub Copilot (Claude Opus 4.5 model). As a Japanese developer who is not a native English speaker, I appreciate your understanding if there are any awkward expressions!*