我需要编写一个ant任务来确定某个文件是否只读,如果是,则失败。我想避免使用自定义选择器来完成构建系统的性质。任何人有任何想法如何去做这个?我正在使用ant 1.8 + ant-contrib。
谢谢!
答案 0 :(得分: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
task和isfileselected
condition(不是直接链接 - 您必须在页面下搜索)与writable
selector相结合(并以{{1条件)。
可能更好的选择是:
not
这将检查和失败作为一个不同的操作而不是两个,因此您可能会发现它更清晰,并且它不需要使用属性名称,因此您的命名空间更清晰。
答案 1 :(得分:0)
我确信有更好的方法,但我会抛出一些可能的方法。
使用java任务执行执行某些简单代码的任务,例如:
文件f =新文件(路径); f.canWrite()......
答案 2 :(得分:0)
编写custom condition任务使用condition怎么样?它更灵活。
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>