我想使用Ant来获取svn存储库的最新提交的用户名。
我怎样才能跨平台做到这一点?
谢谢!
答案 0 :(得分:7)
所以,这里是“svnant”的例子:
<path id="devlibs.path">
<fileset dir="devlib" includes="**/*.jar" />
</path>
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="devlibs.path" />
<svnSetting
id="svn.settings"
svnkit="false"
javahl="false"
username="${svn.username}"
password="${svn.password}" />
<target name="get-svn-author">
<svn refid="svn.settings">
<singleinfo target="${svn.repo.url}" property="author.result" request="author" />
</svn>
<echo message="Author of last commit: ${author.result}" />
</target>
您应该将“svnant.jar”和“svnClientAdapter.jar”放入“devlibs.path”标识的路径中。和“javahl”或“svnkit”所需的其他库到你的“$ {ANT_HOME} / lib”。
如果你有1.6格式的SVN存储库,你可以使用“svnkit”(在“svnSetting”-block中设置为“true”)。因为“svnkit”是纯Java工具包,所以当您需要跨平台解决方案时,最好使用它。如果您已经切换到1.7,那么我建议使用SVN命令行客户端(在我的示例中为命令行客户端配置“svnSetting”)。查看this page(Slik SVN),了解有关在何处查找以及如何安装不同SVN命令行客户端的信息。
答案 1 :(得分:7)
如果您更喜欢不使用可选任务的解决方案,请参阅以下有关如何执行此操作的要点:
<target name="get-svn-author">
<tempfile property="svninfo.result"/>
<exec executable="svn" output="${svninfo.result}">
<arg value="info"/>
<arg value="${svn.repo.url}"/>
</exec>
<tempfile property="svnauthor.result"/>
<copy file="${svninfo.result}" tofile="${svnauthor.result}">
<filterchain>
<linecontainsregexp>
<regexp pattern="Last Changed Author:*"/>
</linecontainsregexp>
</filterchain>
</copy>
<concat>
<filelist files="${svnauthor.result}"/>
</concat>
<delete file="${svninfo.result}"/>
<delete file="${svnauthor.result}"/>
</target>
一个问题是您编写/删除可能并不总是可能的文件(即,如果您没有权限)。另一个问题是必须安装一个svn客户端(可以通过命令行中的svn
命令运行)。
答案 2 :(得分:1)
我以为我已经发布了答案。这或多或少是malenkiy_scot的answer。但是,我在--xml
命令上使用svn info
标志。这将svn info
命令的输出放在xml输出中。然后我可以使用<xmlproperty>
任务来阅读它。
通过使用资源集合,我还避免了将输出保存到以后必须删除的文件中的问题。
<project>
<property name="svn.url" value="http://svn.foo.com/src/repos"/>
<exec executable="svn"
outputproperty="svn.info">
<arg value="info"/>
<arg value="--xml"/>
<arg value="${svn.url}"/>
</exec>
<xmlproperty prefix="svn">
<propertyresource name="svn.info"/>
</xmlproperty>
<echo message="Last committer = ${svn.info.entry.commit.author}"/>
</project>
我试着看看我是否可以将<exec>
任务本身作为资源使用。这样,我甚至不必将svn info
命令的输出保存到属性。但是,唉,我无法弄清楚如何做到这一点。
最平台中立的方式是Vadim Ponomarev的answer。这就是我打算回答这个问题的方式。
但是,我会将svnkit jar文件包含在devlib
目录中,并强制使用svnkit
。无论安装哪个Subversion客户端,这都可以确保它正常工作。即使没有安装Subversion客户端,它甚至可以工作。只需将所需的jar保存在项目的目录中即可。
答案 3 :(得分:0)
可执行shell中已有一个很好的解决方案。该解决方案的优势在于,您可以使用脚本而不是在构建后阶段将其作为构建阶段的一部分来执行。下面将对此进行说明。见https://stackoverflow.com/a/11837662/5842403
实际上,您可以通过读取/解析build文件夹中的../builds/$BUILD_NUMBER/changelog.xml文件,在构建阶段完成之前访问信息。此文件是使用SVN提交触发创建的,而不是在构建或post_build阶段结束时创建的。这意味着,您可以使用脚本在同一作业的构建阶段开始时解析它,并将数据插入到env变量中。