我需要编写一个 ant 任务来确定某个文件是否是只读的,如果是,则失败。我想避免使用自定义选择器来执行此操作,这与我们构建系统的性质有关。任何人都知道如何去做这件事?我正在使用 ant 1.8 + ant-contrib。
谢谢!
我需要编写一个 ant 任务来确定某个文件是否是只读的,如果是,则失败。我想避免使用自定义选择器来执行此操作,这与我们构建系统的性质有关。任何人都知道如何去做这件事?我正在使用 ant 1.8 + ant-contrib。
谢谢!
这样的事情会奏效吗?
<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>
这将检查和失败作为一个不同的操作而不是两个,因此您可能会发现它更清晰,并且不需要使用属性名称,因此您的命名空间更清晰。
我确信有更好的方法,但我会抛出一些可能的方法。
使用 java 任务执行一个任务,该任务执行一些简单的代码,例如:
文件 f = 新文件(路径);f.canWrite()......
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>