98 个版本
新 0.2.13 | 2024年8月19日 |
---|---|
0.2.12 | 2024年7月9日 |
0.2.9 | 2024年6月24日 |
0.1.89 | 2024年3月25日 |
0.1.65 | 2023年7月28日 |
34 在 开发工具 中
每月20,387 次下载
385KB
10K SLoC
packs
packwerk 的 100% Rust 实现,packwerk 是 Ruby 的渐进式模块化平台。
目标
作为大多数项目中 packwerk 的直接替换
- 目前可以在 Gusto 的超大 Rails 单体应用中作为直接替换使用
- 这是一个正在进行中的项目!请参阅 验证 了解如何验证
packs
的输出与packwerk
相同。
在大多数项目中比 packwerk 运行快 20 倍
- 目前比 Ruby 实现快 10-20 倍。请参阅 BENCHMARKS.md。
- 效果可能会有所不同!
- 其他性能改进即将推出!
支持非 Rails、非 zeitwerk 应用
- 目前通过实验性实现支持非 Rails 应用
- 使用与
packwerk
相同的公共 API,但行为不同。 - 有关更多信息,请参阅 EXPERIMENTAL_PARSER_USAGE.md
使用方法和文档
安装完成后将其添加到您的 $PATH
,只需调用 pks
即可查看 CLI 帮助消息和文档。
Welcome! Please see https://github.com/alexevanczuk/packs for more information!
Usage: pks [OPTIONS] <COMMAND>
Commands:
greet Just saying hi
create Create a new pack
check Look for violations in the codebase
check-contents Check file contents piped to stdin
update Update package_todo.yml files with the current violations
validate Look for validation errors in the codebase
add-dependency Add a dependency from one pack to another
check-unnecessary-dependencies Check for dependencies that when removed produce no violations.
lint-package-yml-files Lint package.yml files
expose-monkey-patches Expose monkey patches of the Ruby stdlib, gems your app uses, and your application itself
delete-cache `rm -rf` on your cache directory, default `tmp/cache/packwerk`
list-packs List packs based on configuration in packwerk.yml (for debugging purposes)
list-included-files List analyzed files based on configuration in packwerk.yml (for debugging purposes)
list-definitions List the constants that packs sees and where it sees them (for debugging purposes)
help Print this message or the help of the given subcommand(s)
Options:
--project-root <PROJECT_ROOT> Path for the root of the project [default: .]
-d, --debug Run with performance debug mode
-e, --experimental-parser Run with the experimental parser, which gets constant definitions directly from the AST
--no-cache Run without the cache (good for CI, testing)
-p, --print-files Print to console when files begin and finish processing (to identify files that panic when processing files concurrently)
-h, --help Print help
-V, --version Print version
安装
请参阅 INSTALLATION.md
使用 VSCode/RubyMine 扩展
packwerk
有一个 VSCode 扩展:[https://github.com/rubyatscale/packwerk-vscode/tree/main](https://github.com/rubyatscale/packwerk-vscode/tree/main)
它还有一个 RubyMine 扩展:[https://github.com/vinted/packwerk-intellij](https://github.com/vinted/packwerk-intellij)
使用扩展与 packs
一起使用非常简单,并提供了更流畅的体验。
说明
- 按照INSTALLATION.md说明安装
packs
- 按照配置说明配置扩展以使用
packs
代替ruby gem,通过将可执行文件设置为packs check
验证
packs
仍在开发中,可能不会与ruby实现产生相同的结果(见尚未支持)。如果是这样,请提交一个问题 - 我很乐意尝试支持你的用例!
说明
- 按照上面的说明安装
packs
- 运行
packs update
- 确认
git diff
的输出为空 - 如果输出不为空,请提交一个问题!
是Rust新手吗?
我也是!这是我第一个Rust项目,所以我很乐意得到反馈、建议和贡献!
Rust是一种底层语言,具有高级抽象、丰富的类型系统,通过创新的编译时检查来关注内存安全。
如果你是Rust新手,不要害怕!http://rust-lang.net.cn有许多优秀的学习资源。
如果你想贡献但不知道从何开始,请联系我!我很乐意帮助你入门。
尚未支持
- 自定义词形变化
- 自定义加载路径
- 可扩展插件系统
行为差异
packs
和packwerk
之间仍然存在一些已知的行为差异。如果你发现任何差异,请提交一个问题!
package_paths
不能以斜杠结尾,例如packs/*/
不受支持,但packs/*
是。package_paths
中的**
是支持的,但不能替代单个*
,例如packs/**
是支持的,并将匹配packs/*/*/package.yml
,但不会匹配packs/*/package.yml
。必须使用packs/*
来匹配。
默认命名空间
packs
支持Zeitwerk默认命名空间。但是,由于它无法访问Rails运行时,您需要在packwerk.yml
中显式指定命名空间。
例如,如果您正在使用packs-rails
和automatic_namespaces
来配置您的默认命名空间,并且您有
packs/foo/app/models/bar.rb
,它被配置为定义Foo::Bar
packs/foo/app/domain/baz.rb
被配置为定义Foo::Baz
您需要在 packwerk.yml
中指定默认命名空间,如下所示
autoload_roots:
packs/foo/app/models: "::Foo"
packs/foo/app/domain: "::Foo"
强制实施全局忽略
enforcement_globs_ignore
可以用于指定不实施违规的 gitignore 风格规则。
示例
# packs/product_services/serv1/foo/package.yml
enforce_privacy: true
enforce_visibility: true
enforcement_globs_ignore:
- enforcements:
- privacy
- visiblity
ignores:
- "**/*"
# Enforce incoming privacy and visibility violation references _only_ in `packs/product_services/serv1/**/*`
- "!packs/product_services/serv1/**/*"
reason: "It was decided only to fix incoming violations from serv1. See ticket #232"
# packs/pack2/package.yml
enforce_dependencies: true
dependencies:
# not required because of the below enforcement_globs_ignore
# - packs/pack1
# required because of the enforcement_globs_ignore exception line
- packs/pack3
enforcement_globs_ignore:
- enforcements:
- dependency
ignores:
- "**/*"
# Enforce outgoing dependency violation references _only_ to `packs/pack3/**/*`
- "!packs/pack3/**/*"
reason: "The other dependency violations are fine as those packs will be absorbed into this one."
基准测试
请参阅 BENCHMARKS.md
致谢
- 当前 (@gmcgibbon, @rafaelfranca) 以及前 Shopifolks (@exterm, @wildmaples) 为开源和维护
packwerk
- Gusties,以及 Ruby/Rails 模块化 Slack 服务器,为持续的反馈和支持
- @mzruya 为初始实现和 Rust 启发
依赖项
~15MB
~273K SLoC