如何在使用Ant的tar任务时保留文件权限?

12

当然可以使用exec任务完成,但我的问题是:

是否可以使用tar任务完成?

3个回答

16

我认为没有办法保留现有权限,因为根据复制任务的说明:

Unix提示:在复制文件时不会保留文件权限,它们最终将具有默认的UMASK权限。这是由于当前Java运行时中缺乏任何查询或设置文件权限的方法所致。如果您需要保存权限的复制功能,请改用<exec executable="cp" ... >

但是,tar任务可以接受一个或多个tarfileset元素。可以使用tarfileset定义filemode和/或dirmode属性来指定unix权限。如果您指定多个包含仅匹配那些文件以获取每个所需权限集的包含,则该集中的文件将以那些权限包括。


15

这是不可能的。缺少权限使得 ant tar 任务对我几乎没用。除非使用exec 任务执行操作系统tar,否则无法完成它:

    <exec executable="tar" output="/dev/null" os="Linux">
        <arg value="--exclude-from=files_to_exclude.txt"/>
        <arg value="-cvz"/>
        <arg value="--file=${file.tar}"/>
        <arg value="."/>
    </exec>

几乎所有人类已知的操作系统都有gnu tar二进制文件。将其中一个放入您的版本控制系统中,并根据您的操作系统使用它。是的,每次运行时Ant都需要分叉一个进程。


为什么这个被踩了?这是一个完全正确的解决方案 - 应该点赞。 - purecharger
4
很可能被 downvote 的原因是回答者没有仔细阅读问题:“当然可以使用 exec 任务来完成”。 - three-cups
1
ant tar 是完全无用的。我知道为什么(Java 无法读取文件权限或一些垃圾),但这并不意味着当我想要 tar 时就必须重写所有权限,这是没有用的。这应该是正确的答案。 - Chris
2
这并不是一个真正的解决方案,只能在有tar二进制文件的操作系统上工作。如果我想要在任何平台上构建,该怎么办? - Rachid Boudjelida
我已经阅读了这个问题,但由于它是不可能的,至少人们会停止搜索并使用一个好的解决方案。 - neves

8

我们的项目使用tarfileset运行良好。以下是一个工作示例,以防有人需要:

    <tar destfile="${dist}/${module.name}-${version}.tar">
        <tarfileset dir="${package.dir}" filemode="550" includesfile="${home.dir}/includelist.txt">
            <include name="*.sh"/>
        </tarfileset>
    </tar>

在这个例子中,includelist.txt 用于告诉哪些文件要包含在 tar 文件中。所有扩展名为 *.sh 的文件将对用户和组具有读取和执行权限 (550)。
希望这能帮助到某些人。

让我猜猜:是ivy + git仓库吗?因为这就是我来到这个问题的原因。 - bassim
这应该是正确的方法!这是做到它的正确方式。 - Rachid Boudjelida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接