如何在bazel中压缩文件

雅克斯基

我的存储库中有一组文件。如何从bazel中的那些文件中生成一个zip文件。我找到了tar.gz等的规则,但是找不到找到zip归档文件的方法。

找到了提到拉链的参考文献,但无法弄清楚如何加载和使用它。可以使用淡褐色的人帮忙吗?

阿赫梅斯基

拉链实用程序位于@bazel_tools//tools/zip:zipper,这是它的用法:

Usage: zipper [vxc[fC]] x.zip [-d exdir] [[zip_path1=]file1 ... [zip_pathn=]filen]
  v verbose - list all file in x.zip
  x extract - extract files in x.zip to current directory, or
       an optional directory relative to the current directory
       specified through -d option
  c create  - add files to x.zip
  f flatten - flatten files to use with create or extract operation
  C compress - compress files when using the create operation
x and c cannot be used in the same command-line.

For every file, a path in the zip can be specified. Examples:
  zipper c x.zip a/b/__init__.py= # Add an empty file at a/b/__init__.py
  zipper c x.zip a/b/main.py=foo/bar/bin.py # Add file foo/bar/bin.py at a/b/main.py

If the zip path is not specified, it is assumed to be the file path.

因此它可以genrule像这样使用:

$ tree
.
├── BUILD
├── dir
│   ├── a
│   ├── b
│   └── c
└── WORKSPACE

1 directory, 5 files


$ cat BUILD
genrule(
  name = "gen_zip",
  srcs = glob(["dir/*"]),
  tools = ["@bazel_tools//tools/zip:zipper"],
  outs = ["files.zip"],
  cmd = "$(location @bazel_tools//tools/zip:zipper) c $@ $(SRCS)",
)


$ bazel build :files.zip
INFO: Analyzed target //:files.zip (7 packages loaded, 41 targets configured).
INFO: Found 1 target...
Target //:files.zip up-to-date:
  bazel-bin/files.zip
INFO: Elapsed time: 0.653s, Critical Path: 0.08s
INFO: 1 process: 1 linux-sandbox.
INFO: Build completed successfully, 2 total actions


$ unzip -l bazel-bin/files.zip
Archive:  bazel-bin/files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2010-01-01 00:00   dir/a
        0  2010-01-01 00:00   dir/b
        0  2010-01-01 00:00   dir/c
---------                     -------
        0                     3 files

可以类似地在Starlark中使用它:

def _some_rule_impl(ctx):

  zipper_inputs = []
  zipper_args = ctx.actions.args()
  zipper_args.add("c", ctx.outputs.zip.path)
  ....
  ctx.actions.run(
    inputs = zipper_inputs,
    outputs = [ctx.outputs.zip],
    executable = ctx.executable._zipper,
    arguments = zipper_args,
    progress_message = "Creating zip...",
    mnemonic = "zipper",
  )


some_rule = rule(
  implementation = _some_rule_impl,
  attrs = {
    "deps": attr.label_list(),
    "$zipper": attr.label(default = Label("@bazel_tools//tools/zip:zipper"), cfg = "host", executable=True),
  },
  outputs = {"zip": "%{name}.zip"},
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章