3

我想使用 Ant 获取 svn 存储库的最新提交的用户名。

我怎样才能做到这一点尽可能跨平台?

谢谢!

4

4 回答 4

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”)。查看此页面(Slik SVN) 以获取有关在何处查找以及如何安装不同 SVN 命令行客户端的信息。

于 2012-04-14T06:39:56.853 回答
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命令行中的命令运行)。

于 2012-04-15T22:25:56.967 回答
1

我以为我已经发布了答案。这或多或少是 malenkiy_scot 的回答。但是,我在命令上使用了--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 的回答。这就是我打算回答这个问题的方式。

但是,我会在devlib目录中包含 svnkit jar 文件,并强制使用svnkit. 这确保无论安装哪个 Subversion 客户端都能正常工作。即使没有安装 Subversion 客户端,它也可以工作。只需将所需的 jars 保存在项目的目录中即可。

于 2012-04-16T22:38:41.573 回答
0

在可执行外壳中已经有一个很好的解决方案。该解决方案的优点是您可以使用脚本作为构建阶段的一部分,而不是在构建后阶段。这将在下面解释。见https://stackoverflow.com/a/11837662/5842403

事实上,您可以在构建阶段完成之前通过读取/解析构建文件夹中的 ../builds/$BUILD_NUMBER/changelog.xml 文件来访问信息。该文件是在 SVN 提交触发时创建的,而不是在构建或 post_build 阶段结束时创建的。这意味着,您可以在同一作业的构建阶段开始时使用脚本对其进行解析,并将数据插入环境变量中。

于 2016-01-28T14:23:30.010 回答