Open huruji opened 3 years ago
node-prune 是 tj 大神用 go 写的用来删除 node_modules 里不必要的文件(如 .md、.eslintrc)以更快地部署 serverless 应用。 这是一个命令行工具,安装之后只需要运行一下 node-prune 就可以删除掉这些文件。
本身命令比较简单,因此没有使用到类似 https://github.com/urfave/cli 这种命令行第三方库,直接使用了内置的 flag 库来实现
同时支持 verbose flag 作为定位bug时的输出,同时支持 exclude 和 include option 来支持指定不包括和包括删除的文件(文件夹)
这个库的核心是一个 Prune 的 struct,
这 Prune 中定义了默认删除的文件、文件夹和文件后缀:
同时也定义了一堆用在初始化参数去修改这些默认的方法,最后将这些方法通过 New 方法去初始化 prune struct:
在开始遍历前根据 cpu 数量创建多个协程去消费 chan:
这里通过 sync.WaitGroup 来做子协程的等待。
遍历对应的文件夹(默认为 node_modules),同时将删除文件夹和文件的操作推入通道内,这样可以充分利用 go 的并发特性
对于这里的并发特性,使用一个项目进行测试,使用协程时花费的时间:
当去掉协程,同步去做删除操作的时候,耗时为:
很明显,使用协程的高并发性能确实提升了。
在对最后文件数量和 size 统计的时候使用了 https://github.com/dustin/go-humanize 这个库,这个库的作用就是把size、time、number 等变成人更加易读的表示
总体来说,整个库功能简单,代码量不多,是一个方便学习 go 制作 cli、go 协程、文件处理的一个库。
node-prune 是 tj 大神用 go 写的用来删除 node_modules 里不必要的文件(如 .md、.eslintrc)以更快地部署 serverless 应用。 这是一个命令行工具,安装之后只需要运行一下 node-prune 就可以删除掉这些文件。
本身命令比较简单,因此没有使用到类似 https://github.com/urfave/cli 这种命令行第三方库,直接使用了内置的 flag 库来实现
同时支持 verbose flag 作为定位bug时的输出,同时支持 exclude 和 include option 来支持指定不包括和包括删除的文件(文件夹)
这个库的核心是一个 Prune 的 struct,
这 Prune 中定义了默认删除的文件、文件夹和文件后缀:
同时也定义了一堆用在初始化参数去修改这些默认的方法,最后将这些方法通过 New 方法去初始化 prune struct:
在开始遍历前根据 cpu 数量创建多个协程去消费 chan:
这里通过 sync.WaitGroup 来做子协程的等待。
遍历对应的文件夹(默认为 node_modules),同时将删除文件夹和文件的操作推入通道内,这样可以充分利用 go 的并发特性
对于这里的并发特性,使用一个项目进行测试,使用协程时花费的时间:
当去掉协程,同步去做删除操作的时候,耗时为:
很明显,使用协程的高并发性能确实提升了。
在对最后文件数量和 size 统计的时候使用了 https://github.com/dustin/go-humanize 这个库,这个库的作用就是把size、time、number 等变成人更加易读的表示
总体来说,整个库功能简单,代码量不多,是一个方便学习 go 制作 cli、go 协程、文件处理的一个库。