我知道这个问题已多次出现,例如:Getting the subversion repository number into code。
但要么我理解太复杂,要么对我的项目来说过于复杂。 这是我的简短设置: 几个开发人员使用visual studio 2012和ankhsvn连接到我们的subversion存储库,开发一个.net Web应用程序。 开发服务器使用cruisecontrol.net同步存储库中的最新文件。 测试服务器,手动复制特定修订版以进行QA。
请求是在网站上显示最新版本,以便测试人员知道他们正在查看的版本。
最简单的方法是什么?是否有一些直接从代码中获取它的方法(最佳方案)?可以在cruisecontrol.net上为我做这件事(但是这会离开手动部署的测试服务器)。我进行了搜索和搜索,许多解决方案似乎很麻烦,我只是想知道在开始构建精心设计的装置之前是否有更简单的方法。
答案 0 :(得分:4)
无法直接从代码中获取修订号(我假设您的意思是您的代码),除非您自己将其放在那里。
有多种方法可以做到(并且下面的列表并非详尽无遗),具体取决于您的构建过程的样子以及您想要做多少工作。
$Revision$
关键字&让Subversion客户端CCNet调用自动扩展它。你的问题不够具体,不能详细介绍。你没有描述你所发现的未指明解决方案的“麻烦”,而“最简单”是一个非常主观的措施。
答案 1 :(得分:4)
我们团队为QA / Beta和生产环境部署代码提供了相同的环境。在我看来,以及我们这样做的方式,这可以通过简单的dos脚本和svn命令行客户端来完成。
除此之外,我们还提供了当前版本相对于生产部署所拥有的所有更改的列表。这样开发者就可以清楚地知道从分期到生活会发布什么样的差异。
以下是:
我们的CCnet部署为每个开发应用程序配置了3个相关项目。
这将在Web根文件夹
中创建版本<cb:define name="versionFileCreator">
<exec description="Creating the version info file to path [$(appRootFolder)\Version.txt].">
<executable>$(command_line_program_path)</executable>
<buildArgs />
<dynamicValues>
<replacementValue>
<format>/C echo {0} > "$(appRootFolder)\Version.txt" </format>
<parameters>
<namedValue>
<name>$CCNetLabel</name>
</namedValue>
</parameters>
<property>buildArgs</property>
</replacementValue>
</dynamicValues>
<buildTimeoutSeconds>900</buildTimeoutSeconds>
<successExitCodes>0</successExitCodes>
</exec>
</cb:define>
此模板使用dos脚本进行工作,本节后面将对此进行解释
<cb:define name="publishChangesFromSvn">
<exec description="Consolidating and publishing changes from path [$(svnPathForProductionVersion)] ">
<executable>versionHistoryPublisher.bat</executable>
<buildArgs>"$(svnPathForProductionVersion)" "$(appDirectory)" "$(svnSrcCodeRootPath)" $(svn_password)</buildArgs>
</exec>
</cb:define>
@echo off
set currentProductionVersionFileSvnUrl=%1
set workingDirectory=%2
set sourceCodeSvnPath=%3
set svnPassword=%4
REM **** Creating the file with last production version ***
svn export "%currentProductionVersionFileSvnUrl%//Version.txt" "%workingDirectory%\lastProductionVersion.txt" --username %svnusername% --password %svnPassword% --force --non-interactive --quiet
set /p lastCcnetBuildNumber=< %workingDirectory%\lastProductionVersion.txt
set /p currentCcnetBuildNumber=< %workingDirectory%\Version.txt
for /f "tokens=4 delims=." %%a in ("%lastCcnetBuildNumber%") do set lastSvnRevisionNumber=%%a
for /f "tokens=4 delims=." %%a in ("%currentCcnetBuildNumber%") do set headRevisionNumber=%%a
for /f "tokens=1 delims= " %%a in ("%headRevisionNumber%") do set headRevisionNumber=%%a
echo %lastVersion%
echo Changes in current deployment w.r.t production. > %workingDirectory%\currentChangeList.txt
echo =============================================== >> %workingDirectory%\currentChangeList.txt
echo Current revison : %headRevisionNumber% >> %workingDirectory%\currentChangeList.txt
echo Compared to production version : %lastSvnRevisionNumber% >> %workingDirectory%\currentChangeList.txt
echo =============================================== >> %workingDirectory%\currentChangeList.txt
svn log %sourceCodeSvnPath% -r %headRevisionNumber%:%lastSvnRevisionNumber% --verbose --username %svnusername% --password %svnPassword% >> %workingDirectory%\currentChangeList.txt
<project queue="Staging" queuePriority="1">
...your project configurations....
<cb:svn_settings svn_src_code_path="$(svnSrcCodeRootPath)" />
<tasks>
<artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="10" />
<modificationHistory onlyLogWhenChangesFound="true" />
<sequential>
<tasks>
<!-- Build the web-->
<msbuild description="Building [$(msbuildWorkingDirectory)\$(solutionFileName)] using MsBuild.">
.. your ms build configuration...
</msbuild>
<!-- create the version file -->
<cb:versionFileCreator />
<cb:publishChangesFromSvn svnPathForProductionVersion="$(productionCheckedInVersion)"
appDirectory="$(appRootFolder)" />
</tasks>
</sequential>
</tasks>
<publishers>
<!-- default XML logger of CCNET -->
<xmllogger />
</publishers>
<triggers>
<intervalTrigger name="continuous" seconds="15" buildCondition="IfModificationExists" initialSeconds="30" />
</triggers>
</project>
版本信息位于version.txt文件中,代码更改历史记录位于currentChangeList.txt文件中。由于这两个文件都在Web根目录中,因此可以通过URL轻松访问它们
此外,如果您想在您的网站上显示版本号,您可以轻松地从version.txt中读取一行,并在app_start期间的任何位置显示它。
答案 2 :(得分:3)
SharpSVN允许您执行此操作,如果您知道存储库路径:
using SharpSvn;
private static long GetRevision()
{
using (SvnClient client = new SvnClient())
{
SvnInfoEventArgs info;
return client.GetInfo(SvnPathTarget.FromString(REPO_PATH), out info) ? info.Revision : 0;
}
}
答案 3 :(得分:2)
接受答案的第二点非常简单,并提供了所需的结果:应用程序UI中某处的输出修订号:
在构建过程中使用SubWCRev.exe和一些自定义代码(脚本) 将值插入文件。
1)考虑要使用的程序集属性,并在其中一个项目的AssemblyInfo
文件中注释/删除其行(我选择了“常用”项目并{{1属性)。某些限制可能适用于基于msbuild版本的各种程序集属性,如here所示。
2)创建模板以用于生成整个版本。例如:AssemblyFileVersion
SolutionInfo.cs.tmpl
3)创建实际文件以用于存储生成的版本。例如:using System.Reflection;
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
// [assembly: AssemblyVersion("1.0.0.$WCREV$")]
。这可以是空的,因为它将在构建时自动生成。构建之后,它应该是这样的:
SolutionInfo.cs
确保从源代码管理中忽略/排除此文件。
4)创建预建事件以获取修订版号并从其模板创建文件:
using System.Reflection;
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyFileVersion("1.0.0.16788")]
// [assembly: AssemblyVersion("1.0.0.16788")]
注意:此构建事件假定TortoiseSVN在其默认路径中安装了subwcrev。构建服务器必须具有相同的配置,以便构建不会崩溃。如果在"C:\Program Files\TortoiseSVN\bin\subwcrev" "$(ProjectDir).\.." "$(ProjectDir)\Properties\SolutionInfo.cs.tmpl" "$(ProjectDir)\Properties\SolutionInfo.cs"
中注册subwcrev
,则不再需要完整路径。
5)版本提取
PATH
答案 4 :(得分:2)
subversion使用的db是sqlite,在项目的.svn文件夹中称为wc.db。您需要做的就是使用sqlite db provider(Install-Package System.Data.Sqlite
),并使用wc.db的完整路径作为连接字符串中的数据源运行Select max(revision) from NODE
答案 5 :(得分:0)
请求是在网站上显示最新版本 测试人员知道他们正在查看的版本。
这是我打算做的事情:
测试人员需要你建立的构建信息。为什么不创建调用svnversion
或svn info
的批处理文件并将输出写入文本文件?您可以使用项目/解决方案文件的后期构建事件来调用它,甚至可以在部署新构建时使用cruisecontrol。如果文件是在您的网站中生成的,您可以使用asp.net阅读并在页脚中包含信息,或者只是让测试人员访问此文本文件。
不是一个直接的解决方案。但肯定会有效。