使用 tar 创建发布版本

使用 tar 创建发布版本

我有一个包含常见内容的项目(源代码,yadda,yadda),我想要一个 Scons 命令(但老实说它可以是任何构建系统),它将执行以下操作:

  1. 构建系统——这很容易。
  2. 创建系统的 tar 球——这很容易。
  3. 当 tar 球的内容被提取时,它们会提取到一个fubar-VERSION/目录中——这是棘手的部分。

我可以通过创建符号链接来手动执行后者,然后tar从项目上方的一个目录进行 ing,但这感觉不太优雅。任何想法?

为了澄清,我希望能够做到这一点:

; pwd
~/project
; scons release
[...]
; cp project-X.Y.Z.tbz /tmp
; cd /tmp
; tar jxvf project-X.Y.Z.tbz
./project-X.Y.Z/[...]

因此,存档会提取到以具有正确版本号的项目命名的目录中。

答案1

使用 GNU tar:

tar cjf ../fubar-4.2.tar.bz2 --transform='s/^\./fubar-4.2/' --exclude='*.o' .

传统的 tar 实现无法做到这一点。据我所知,即使 FreeBSD tar 也没有类似的功能。

帕克斯, cpio 和 tar 的 POSIX 替代品:

pax -w -s '/^\./fubar-4.2/' -s '/\.o$//' . | bzip2 >../fubar-4.2.tar.bz2

尽管pax在当前的 POSIX/Single Unix 标准中是强制性的,但许多 Linux 发行版默认情况下并不安装它。如果您同时支持 GNU tar 和 pax,您将涵盖几乎所有非嵌入式 unice。

答案2

至少bsdtar 2.8.4和向上可以-s pattern选择根据给定的基本正则表达式模式修改文件或存档成员名称。

# using '^\.' as pattern
bsdtar -czvf test.tar.gz .
bsdtar -tzvf test.tar.gz
bsdtar -s '|^\.|archive-X.Y.Z|' -xzvf test.tar.gz

# using '^[^/]*' as pattern
bsdtar -C .. -czvf test.tar.gz "$(basename "$(pwd -P)")"
bsdtar -tzvf test.tar.gz
bsdtar -s '|^[^/]*|archive-X.Y.Z|' -xzvf test.tar.gz

相关内容