Macrodef 属性不改变它的值
Macrodef attribute doesnt change its value
在我之前的 post 中,我试图实现 macrodef
以便用“类似函数”的任务替换重复的代码块。然后我遇到了一些问题。之后我减少了脚本,所以我可以尝试我不习惯的任务。这是我编的:
<project basedir="../../../" name="do-report" default="extract-common-paths">
<xmlproperty keeproot="false" file="implementation/xml/ant/properties.xml"/>
<!-- -->
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="${infrastructure-base-dir}/apache-ant-1.9.6/lib/antcontrib.jar"/>
</classpath>
</taskdef>
<!-- -->
<macrodef name="get-common-path">
<attribute name="common-path-property"/>
<attribute name="file"/>
<attribute name="file-base-dir"/>
<sequential>
<local name="file-dir-absolute-path"/>
<dirname property="file-dir-absolute-path" file="@{file}"/>
<property name="file-base-dir-absolute-path" location="@{file-base-dir}"/>
<echo>MACRODEF FILE: ${file-dir-absolute-path}</echo>
<echo>MACRODEF FILE-BASE-DIR: ${file-base-dir-absolute-path}</echo>
<pathconvert property="@{common-path-property}" dirsep="/">
<path location="${file-dir-absolute-path}"/>
<map from="${file-base-dir-absolute-path}/" to=""/>
</pathconvert>
</sequential>
</macrodef>
<!-- -->
<target name="clean">
<delete dir="${dita-odt.path.odt-unzipped-base-dir}" includeemptydirs="true" failonerror="no"/>
<delete dir="examples/intermediate/odt-files" includeemptydirs="true" failonerror="no"/>
</target>
<!-- -->
<target name="unzip-writing-odt-file" depends="clean">
<unzip src="${dita-odt.path.writing-odt}" dest="${dita-odt.path.writing-odt-unzipped}"/>
</target>
<!-- -->
<target name="extract-common-paths" depends="unzip-writing-odt-file">
<for param="file">
<path>
<fileset dir="${dita-odt.path.text-xml-base-dir}">
<include name="**/content.xml"/>
</fileset>
</path>
<sequential>
<get-common-path common-path-property="common-path" file="@{file}" file-base-dir="${dita-odt.path.text-xml-base-dir}"/>
<echo>THIS IS THE PATH: ${common-path}</echo>
</sequential>
</for>
</target>
</project>
FOR
任务迭代不同目录中的两个文件。实际上 FOR
按预期工作。它应该通过 ${file}
。 macrodef
属性common-path-property
首先设置为第一个文件的转换路径(可以)。但是当第二个文件传递给 get-common-path/@file
时,属性 common-path-property
没有改变它的值,我再次收到这个:
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
相反,我希望收到这个:
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: \t2\t2.1
我希望你明白我想做什么。提前致谢!
尝试打印 macrodef 属性值而不是 属性 值。
@{attribute}
- 可以随着宏定义的每次执行而改变
${property}
- 总是在 Ant 中设置和固定一次,即使在 macrodef 中也是如此
- 除非前面有
<local>
任务,在这种情况下,在该块的范围内使用本地设置的 属性 值。
可能你想要的是蚂蚁Local task。
Adds a local property to the current scope. Property scopes exist at
Apache Ant's various "block" levels.
在我之前的 post 中,我试图实现 macrodef
以便用“类似函数”的任务替换重复的代码块。然后我遇到了一些问题。之后我减少了脚本,所以我可以尝试我不习惯的任务。这是我编的:
<project basedir="../../../" name="do-report" default="extract-common-paths">
<xmlproperty keeproot="false" file="implementation/xml/ant/properties.xml"/>
<!-- -->
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="${infrastructure-base-dir}/apache-ant-1.9.6/lib/antcontrib.jar"/>
</classpath>
</taskdef>
<!-- -->
<macrodef name="get-common-path">
<attribute name="common-path-property"/>
<attribute name="file"/>
<attribute name="file-base-dir"/>
<sequential>
<local name="file-dir-absolute-path"/>
<dirname property="file-dir-absolute-path" file="@{file}"/>
<property name="file-base-dir-absolute-path" location="@{file-base-dir}"/>
<echo>MACRODEF FILE: ${file-dir-absolute-path}</echo>
<echo>MACRODEF FILE-BASE-DIR: ${file-base-dir-absolute-path}</echo>
<pathconvert property="@{common-path-property}" dirsep="/">
<path location="${file-dir-absolute-path}"/>
<map from="${file-base-dir-absolute-path}/" to=""/>
</pathconvert>
</sequential>
</macrodef>
<!-- -->
<target name="clean">
<delete dir="${dita-odt.path.odt-unzipped-base-dir}" includeemptydirs="true" failonerror="no"/>
<delete dir="examples/intermediate/odt-files" includeemptydirs="true" failonerror="no"/>
</target>
<!-- -->
<target name="unzip-writing-odt-file" depends="clean">
<unzip src="${dita-odt.path.writing-odt}" dest="${dita-odt.path.writing-odt-unzipped}"/>
</target>
<!-- -->
<target name="extract-common-paths" depends="unzip-writing-odt-file">
<for param="file">
<path>
<fileset dir="${dita-odt.path.text-xml-base-dir}">
<include name="**/content.xml"/>
</fileset>
</path>
<sequential>
<get-common-path common-path-property="common-path" file="@{file}" file-base-dir="${dita-odt.path.text-xml-base-dir}"/>
<echo>THIS IS THE PATH: ${common-path}</echo>
</sequential>
</for>
</target>
</project>
FOR
任务迭代不同目录中的两个文件。实际上 FOR
按预期工作。它应该通过 ${file}
。 macrodef
属性common-path-property
首先设置为第一个文件的转换路径(可以)。但是当第二个文件传递给 get-common-path/@file
时,属性 common-path-property
没有改变它的值,我再次收到这个:
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
相反,我希望收到这个:
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: t1/t1.1
[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1
[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text
[echo] THIS IS THE PATH: \t2\t2.1
我希望你明白我想做什么。提前致谢!
尝试打印 macrodef 属性值而不是 属性 值。
@{attribute}
- 可以随着宏定义的每次执行而改变${property}
- 总是在 Ant 中设置和固定一次,即使在 macrodef 中也是如此- 除非前面有
<local>
任务,在这种情况下,在该块的范围内使用本地设置的 属性 值。
- 除非前面有
可能你想要的是蚂蚁Local task。
Adds a local property to the current scope. Property scopes exist at Apache Ant's various "block" levels.