我的公司正在从 Visual Source Safe 过渡到 Subversion;我们的管道管理工具依赖于 VSS 提供的“影子文件夹”的存在,以便将代码从版本控制移动到各种测试环境。注意:我们使用一种解释性语言并将我们的源代码翻译成目标代码——目前,源代码和目标代码都处于版本控制之下(特别是为了满足管道管理机制的需要)。
作为一个迭代步骤,我试图用一点天赋来模仿影子文件夹功能,因为我希望在提交时开始翻译,这样我们就不需要在 Subversion 中存储源代码和目标代码。注意:我不得不破解这个过程,从执行所有内容的干净“构建”到只在提交期间翻译受影响的文件,因为否则它需要太长时间才能成为实时提交操作(将来我希望我们会放弃这个过程有利于一些不太互动的东西,例如每小时构建或诸如此类的东西)。
所有这些背景故事只是为了问一个问题:${user.dir} 属性是如何设置的?
这是我的提交后挂钩批处理文件(一切都在 Windows 上完成):
SET REPO=%1
SET REV=%2
FOR %%* IN (%REPO%) DO SET REPONAME=%%~n*
SET BUILDROOT=E:\builds
IF NOT EXIST %BUILDROOT% ( MKDIR %BUILDROOT% )
SET BUILDDIR=%BUILDROOT%\%REPONAME%
IF NOT EXIST %BUILDDIR% ( MKDIR %BUILDDIR% )
CD %BUILDDIR%
ECHO %CD%
ECHO %BUILDDIR%
C:\apache-ant-1.8.3\bin\ant -f C:\dev\shadow\build.xml -DWorkingDir=%BUILDDIR%\!build_work_dir -DSvnRepoUrl=file:///%REPO% -DFromRevision=%REV% > %BUILDDIR%\!last_build_result.txt 2>&1
最后一行是实际的 Ant 调用;您可以看到我正在将输出重定向到一个文件,该文件位于 %BUILDDIR% 或 E:\builds\ 中。该文件按预期创建,这表明 %BUILDDIR% 已正确设置,因此:
CD %BUILDDIR%
行应该已经执行。我知道 SVN 使用空环境启动提交后挂钩,但我希望更改其中的目录应该在启动 Ant 后保留状态。
后来,在我的 Ant 脚本中,我设置了我的 ${build.dir} 属性:
<property name="build.dir" value="${user.dir}\.build.${build.time}" />
<!-- delete the build.dir, just in case we attempt a new build within the same minute...
TODO: we may need to account for concurrent builds; does SVN single-thread commits? -->
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
如果 %REPONAME%(在批处理文件中)是 DEMO,我预计当前工作目录是:E:\builds\DEMO,因此 ${build.dir} 应该类似于:E:\builds\DEMO.build。 20120622.1127,但它是:C:\dev\shadow.build.20120622.1127,而不是。
据我了解,Ant 只是从 Java 中提取System.Properties来获取 ${user.dir} 之类的东西—— ${user.dir} 被描述为User's current working directory。显然,根据我的实验,批处理文件中的初始设置和关于工作目录的 Java 调用之间存在交叉。
Ant 是否将工作目录更改为构建文件的位置?我没有找到任何文件表明它确实如此,但我可能只是忽略了一些东西。我已经定义了 %ANT_HOME%,但是考虑到 Subversion 的“空环境”,它不会被加载......也许这有效果?我需要进行调查,但希望有人可能会简单地知道这是如何工作的。
编辑(2012-06-22-16:38):
我尝试设置 %ANT_HOME%、%JAVA_HOME% 和 %JAVA_CMD%,但无济于事。