ant-contrib:过时的问题
ant-contrib: issues with outofdate
我的情况与 outofdate
示例非常相似(参见 gengrammer
、http://ant-contrib.sourceforge.net/tasks/tasks/outofdate.html):我有一个包含 *.class
和 [=15 的文件夹=] 文件应在 plantuml
(一个 java
程序)的帮助下转换为 *.pdf
。
这是我当前的任务:
<property name="diagram.path" value="../graphics/plantuml/src"/>
...
<target name="diagram-files" depends="update-classpath">
<outofdate property="manual.outofdate" outputsources="diagram.sources">
<sourcefiles>
<fileset dir="${diagram.path}" includes="*.class"/>
<fileset dir="${diagram.path}" includes="*.seq"/>
</sourcefiles>
<mapper type="glob" dir="${diagram.path}" from="*.class" to="graphics/*.pdf"/>
<mapper type="glob" dir="${diagram.path}" from="*.seq" to="graphics/*.pdf"/>
<sequential>
<shellscript shell="bash">
cd ${diagram.path}
echo ${diagram.sources}
#for diagram in ${diagram.sources}
#do
# java -jar plantuml ... $diagram
#done
</shellscript>
</sequential>
</outofdate>
</target>
我无法将它发送到 运行,因为在 ${diagram.sources}
中所有(反)斜线都被删除了。所以回应这个变量给了我这样的东西:
C:UsersMYUSERpath-to-folderANDsoONmyfile.class
C:UsersMYUSERpath-to-folderANDsoONmyfile2.class
不知道是我做错了什么还是这是一个功能。任何帮助都会很棒!
顺便说一句。我在 Windows 10,但 ant 在 cygwin shell 中 运行ning。我从来没有遇到过这种组合的问题。
不清楚反斜杠是否在执行到达您的 bash 脚本之前被 Ant outofdate
任务删除,或者反斜杠是否进入脚本并且您看到了 shell 转义.
如果是后者,那么您可以通过将 ${diagram.sources}
括在引号中来解决问题,以便 shell 将其解释为字符串文字而不进行转义。例如:
build.xml
<project>
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="/Users/naurc001/ant-contrib-0.6-bin/lib/ant-contrib-0.6.jar"/>
</classpath>
</taskdef>
<property name="diagram.path" value="../graphics/plantuml/src"/>
<property name="diagram.sources.property" value="C:\private\tmp\anttest\graphics\plantuml\src\myfile.class C:\private\tmp\anttest\graphics\plantuml\src\myfile2.class" />
<target name="diagram-files">
<outofdate property="manual.outofdate" outputsources="diagram.sources">
<sourcefiles>
<fileset dir="${diagram.path}" includes="*.class"/>
<fileset dir="${diagram.path}" includes="*.seq"/>
</sourcefiles>
<mapper type="glob" dir="${diagram.path}" from="*.class" to="graphics/*.pdf"/>
<mapper type="glob" dir="${diagram.path}" from="*.seq" to="graphics/*.pdf"/>
<sequential>
<shellscript shell="bash">
echo Unquoted: ${diagram.sources.property}
echo Quoted: '${diagram.sources.property}'
for diagram in $(echo '${diagram.sources.property}')
do
# I don't have plantuml, so just stubbing it to print the command.
echo java -jar plantuml ... $diagram
done
</shellscript>
</sequential>
</outofdate>
</target>
</project>
输出
> ant diagram-files
Buildfile: /private/tmp/anttest/proj/build.xml
diagram-files:
[shellscript] Unquoted:
C:privatetmpanttestgraphicsplantumlsrcmyfile.class
C:privatetmpanttestgraphicsplantumlsrcmyfile2.class
[shellscript] Quoted:
C:\private\tmp\anttest\graphics\plantuml\src\myfile.class
C:\private\tmp\anttest\graphics\plantuml\src\myfile2.class
[shellscript] java -jar plantuml ...
/private/tmp/anttest/graphics/plantuml/src/myfile.class
[shellscript] java -jar plantuml ...
/private/tmp/anttest/graphics/plantuml/src/myfile2.class
BUILD SUCCESSFUL
Total time: 0 seconds
说明
我无法访问 Windows 机器在该平台上进行直接测试,因此我通过硬编码我的 diagram.sources.property
来模拟问题以使用 Windows-路径中的样式反斜杠。 <shellscript>
回显相同的 属性 两次:一次不带单引号,一次带单引号。对于未引用的形式,由于 shell 转义,输出看起来像您描述的那样。引用之后,我们得到了预期的结果。
但是,如果我们只是将 '{diagram.sources.property}'
传递给 jar ...
等其他命令,则会产生意想不到的副作用。 Bash 会将整个列表作为单个参数传递。为了解决这个问题,我们可以将整个内容包装在 $(echo ...)
中以将其转回多个参数。测试输出证明我们为每个文件调用了一次 jar
命令。
根据您需要的工具 运行,有时需要将 Windows 风格的反斜杠路径分隔符转换为 Unix 风格的正斜杠。如果需要,我建议使用 bash 脚本中的 cygpath
实用程序将反斜杠转换为斜杠。特别是 -u
和 -w
选项在这里很有用。
The -u and -w options indicate whether you want a conversion to UNIX (POSIX) format (-u) or to Windows format (-w). Use the -d to get DOS-style (8.3) file and path names. The -m option will output Windows-style format but with forward slashes instead of backslashes. This option is especially useful in shell scripts, which use backslashes as an escape character.
您提到您正在使用 Cygwin,但也许您也有队友 运行正在 Mac 或直接 Linux 上,您需要与他们互操作。如果是这样,那么您可以在检查 uname -a
的值时保护对 cygpath
的调用。在 Cygwin shell 中,uname -a
的输出将包含某种形式的 "Cygwin".
关于 bash 转义的其他参考资料:
我的情况与 outofdate
示例非常相似(参见 gengrammer
、http://ant-contrib.sourceforge.net/tasks/tasks/outofdate.html):我有一个包含 *.class
和 [=15 的文件夹=] 文件应在 plantuml
(一个 java
程序)的帮助下转换为 *.pdf
。
这是我当前的任务:
<property name="diagram.path" value="../graphics/plantuml/src"/>
...
<target name="diagram-files" depends="update-classpath">
<outofdate property="manual.outofdate" outputsources="diagram.sources">
<sourcefiles>
<fileset dir="${diagram.path}" includes="*.class"/>
<fileset dir="${diagram.path}" includes="*.seq"/>
</sourcefiles>
<mapper type="glob" dir="${diagram.path}" from="*.class" to="graphics/*.pdf"/>
<mapper type="glob" dir="${diagram.path}" from="*.seq" to="graphics/*.pdf"/>
<sequential>
<shellscript shell="bash">
cd ${diagram.path}
echo ${diagram.sources}
#for diagram in ${diagram.sources}
#do
# java -jar plantuml ... $diagram
#done
</shellscript>
</sequential>
</outofdate>
</target>
我无法将它发送到 运行,因为在 ${diagram.sources}
中所有(反)斜线都被删除了。所以回应这个变量给了我这样的东西:
C:UsersMYUSERpath-to-folderANDsoONmyfile.class
C:UsersMYUSERpath-to-folderANDsoONmyfile2.class
不知道是我做错了什么还是这是一个功能。任何帮助都会很棒!
顺便说一句。我在 Windows 10,但 ant 在 cygwin shell 中 运行ning。我从来没有遇到过这种组合的问题。
不清楚反斜杠是否在执行到达您的 bash 脚本之前被 Ant outofdate
任务删除,或者反斜杠是否进入脚本并且您看到了 shell 转义.
如果是后者,那么您可以通过将 ${diagram.sources}
括在引号中来解决问题,以便 shell 将其解释为字符串文字而不进行转义。例如:
build.xml
<project>
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="/Users/naurc001/ant-contrib-0.6-bin/lib/ant-contrib-0.6.jar"/>
</classpath>
</taskdef>
<property name="diagram.path" value="../graphics/plantuml/src"/>
<property name="diagram.sources.property" value="C:\private\tmp\anttest\graphics\plantuml\src\myfile.class C:\private\tmp\anttest\graphics\plantuml\src\myfile2.class" />
<target name="diagram-files">
<outofdate property="manual.outofdate" outputsources="diagram.sources">
<sourcefiles>
<fileset dir="${diagram.path}" includes="*.class"/>
<fileset dir="${diagram.path}" includes="*.seq"/>
</sourcefiles>
<mapper type="glob" dir="${diagram.path}" from="*.class" to="graphics/*.pdf"/>
<mapper type="glob" dir="${diagram.path}" from="*.seq" to="graphics/*.pdf"/>
<sequential>
<shellscript shell="bash">
echo Unquoted: ${diagram.sources.property}
echo Quoted: '${diagram.sources.property}'
for diagram in $(echo '${diagram.sources.property}')
do
# I don't have plantuml, so just stubbing it to print the command.
echo java -jar plantuml ... $diagram
done
</shellscript>
</sequential>
</outofdate>
</target>
</project>
输出
> ant diagram-files
Buildfile: /private/tmp/anttest/proj/build.xml
diagram-files:
[shellscript] Unquoted:
C:privatetmpanttestgraphicsplantumlsrcmyfile.class
C:privatetmpanttestgraphicsplantumlsrcmyfile2.class
[shellscript] Quoted:
C:\private\tmp\anttest\graphics\plantuml\src\myfile.class
C:\private\tmp\anttest\graphics\plantuml\src\myfile2.class
[shellscript] java -jar plantuml ...
/private/tmp/anttest/graphics/plantuml/src/myfile.class
[shellscript] java -jar plantuml ...
/private/tmp/anttest/graphics/plantuml/src/myfile2.class
BUILD SUCCESSFUL
Total time: 0 seconds
说明
我无法访问 Windows 机器在该平台上进行直接测试,因此我通过硬编码我的 diagram.sources.property
来模拟问题以使用 Windows-路径中的样式反斜杠。 <shellscript>
回显相同的 属性 两次:一次不带单引号,一次带单引号。对于未引用的形式,由于 shell 转义,输出看起来像您描述的那样。引用之后,我们得到了预期的结果。
但是,如果我们只是将 '{diagram.sources.property}'
传递给 jar ...
等其他命令,则会产生意想不到的副作用。 Bash 会将整个列表作为单个参数传递。为了解决这个问题,我们可以将整个内容包装在 $(echo ...)
中以将其转回多个参数。测试输出证明我们为每个文件调用了一次 jar
命令。
根据您需要的工具 运行,有时需要将 Windows 风格的反斜杠路径分隔符转换为 Unix 风格的正斜杠。如果需要,我建议使用 bash 脚本中的 cygpath
实用程序将反斜杠转换为斜杠。特别是 -u
和 -w
选项在这里很有用。
The -u and -w options indicate whether you want a conversion to UNIX (POSIX) format (-u) or to Windows format (-w). Use the -d to get DOS-style (8.3) file and path names. The -m option will output Windows-style format but with forward slashes instead of backslashes. This option is especially useful in shell scripts, which use backslashes as an escape character.
您提到您正在使用 Cygwin,但也许您也有队友 运行正在 Mac 或直接 Linux 上,您需要与他们互操作。如果是这样,那么您可以在检查 uname -a
的值时保护对 cygpath
的调用。在 Cygwin shell 中,uname -a
的输出将包含某种形式的 "Cygwin".
关于 bash 转义的其他参考资料: