#packs #ruby #replace #yaml #github #welcome #packwerk

bin+lib pks

欢迎!请参阅 https://github.com/alexevanczuk/packs 获取更多信息!

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开发工具

Download history 225/week @ 2024-05-03 30/week @ 2024-05-10 189/week @ 2024-05-17 662/week @ 2024-05-24 233/week @ 2024-05-31 66/week @ 2024-06-07 24/week @ 2024-06-14 141/week @ 2024-06-21 155/week @ 2024-06-28 360/week @ 2024-07-05 4963/week @ 2024-07-12 5394/week @ 2024-07-19 6316/week @ 2024-07-26 6395/week @ 2024-08-02 5259/week @ 2024-08-09 1178/week @ 2024-08-16

每月20,387 次下载

MIT 许可证

385KB
10K SLoC

packs

Logo

CI Crates.io Security Audit

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有许多优秀的学习资源。

如果你想贡献但不知道从何开始,请联系我!我很乐意帮助你入门。

尚未支持

  • 自定义词形变化
  • 自定义加载路径
  • 可扩展插件系统

行为差异

packspackwerk之间仍然存在一些已知的行为差异。如果你发现任何差异,请提交一个问题!

  • package_paths不能以斜杠结尾,例如packs/*/不受支持,但packs/*是。
  • package_paths中的**是支持的,但不能替代单个*,例如packs/**是支持的,并将匹配packs/*/*/package.yml,但不会匹配packs/*/package.yml。必须使用packs/*来匹配。

默认命名空间

packs支持Zeitwerk默认命名空间。但是,由于它无法访问Rails运行时,您需要在packwerk.yml中显式指定命名空间。

例如,如果您正在使用packs-railsautomatic_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