2

我需要编写一个 ant 任务来确定某个文件是否是只读的,如果是,则失败。我想避免使用自定义选择器来执行此操作,这与我们构建系统的性质有关。任何人都知道如何去做这件事?我正在使用 ant 1.8 + ant-contrib。

谢谢!

4

3 回答 3

3

这样的事情会奏效吗?

<condition property="file.is.readonly">
  <not>
    <isfileselected file="${the.file.in.question}">
      <writable />
    </isfileselected>
  </not>
</condition>
<fail if="file.is.readonly" message="${the.file.in.question} is not writeable" />

这使用了condition任务isfileselected条件(不是直接链接 - 您必须向下搜索页面)结合writable选择器(并与not条件相反)。

更新:

一个可能更好的选择是:

<fail message="${the.file.in.question} is not writeable">
  <condition>
    <not>
      <isfileselected file="${the.file.in.question}">
        <writable />
      </isfileselected>
    </not>
  </condition>
</fail>

这将检查和失败作为一个不同的操作而不是两个,因此您可能会发现它更清晰,并且不需要使用属性名称,因此您的命名空间更清晰。

于 2011-05-16T23:14:23.360 回答
0

我确信有更好的方法,但我会抛出一些可能的方法。

  • 使用复制任务创建一个临时副本,然后尝试复制此文件以覆盖原始文件。failonerror 属性会派上用场
  • 使用 java 任务执行一个任务,该任务执行一些简单的代码,例如:

    文件 f = 新文件(路径);f.canWrite()......

于 2011-05-16T21:21:26.787 回答
0

编写一个供条件任务使用的自定义条件怎么样?它更灵活。

public class IsReadOnly extends ProjectComponent implements Condition
{
  private Resource resource;

  /**
   * The resource to test.
   */
  public void add(Resource r) {
    if (resource != null) {
        throw new BuildException("only one resource can be tested");
    }
    resource = r;
  }

  /**
   * Argument validation.
   */
  protected void validate() throws BuildException {
    if (resource == null) {
        throw new BuildException("resource is required");
    }
  }

  public boolean eval() {
    validate();
    if (resource instanceof FileProvider) {
      return !((FileProvider)resource).getFile().canWrite();
    }
    try {
      resource.getOutputStream();
      return false;
    } catch (FileNotFoundException no) {
      return false;
    } catch (IOException no) {
      return true;
    }
  }
}

与集成

<typedef
  name="isreadonly"
  classname="IsReadOnly"
  classpath="${myclasses}"/>

并像使用它一样

<condition property="readonly">
  <isreadonly>
    <file file="${file}"/>
  </isreadonly>
</condition>
于 2011-05-16T22:14:58.313 回答