2011-11-24 71 views
2

我花了最近2天试图找出如何相对使用MSBuild社区任务包中的SvnInfo任务。它在我的机器上工作,因为我使用了安装程序。虽然我应该能够使它与相对路径一起工作。如果我不在CI服务器上安装这个包,我应该可以将包存储在svn中,并且当ci服务器获取所有代码来构建它时,我编写的构建脚本似乎试图引用任务和dll等关闭c:驱动器,它通常会安装但不存在。我不知道为什么。即使我使用属性来引用相关任务,然后在整个任务中引用属性,它仍似乎错误。通过相对路径引用msbuild社区任务

我想从subversion(我们的svn)中检索svn版本号,然后更新程序集版本号。这样我们可以将实现的内容与该版本的变更集相关联。我能找到的关于msbuild社区包的小文档说我只能使用客户端,但唯一能找到的是slik svn。它似乎在本地工作,但不知何故,这也感觉不对......应坚持与svn相同的味道。

如果任何人有任何建议或改进或链接,他们能够发现我不能......这将不胜感激。

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0"> 

    <PropertyGroup> 
    <RevisionNumber Condition=" '$(RevisionNumber)' == '' ">x</RevisionNumber> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    </PropertyGroup> 


    <!-- 1 --> 
    <Import Project=".\ThirdParty\Tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 
    <UsingTask AssemblyFile=".\ThirdParty\Tools\MyMSBuildExtensions\BuildTasks.MSBuildTaks.dll" 
     TaskName="BuildTasks.MSBuildTasks.AssemblyInfoReader" /> 
    <UsingTask AssemblyFile="$(MSBuildCommunityTasksPath)MSBuild.Community.Tasks.dll" 
     TaskName="MSBuild.Community.Tasks.Subversion.SvnInfo" /> 


    <ItemGroup> 
    <!-- Required here in order to use the outDir syntax in the compile target - useage "@(BuildArtifacts)" --> 
    <BuildArtifacts Include=".\buildartifacts\" /> 
    <SolutionFile Include=".\OnlineSales.sln" /> 
    </ItemGroup> 

    <ItemGroup> 
    <NUnit Include=".\ThirdParty\Tools\NUnit\nunit-console.exe" /> 
    <TestAssembly Include=".\buildArtifacts\OnlineSales.Tests.dll" /> 
    <TestResults Include=".\buildartifacts\TestResults.xml" /> 
    </ItemGroup> 


    <Target Name="Clean" > 
    <RemoveDir Directories="@(BuildArtifacts)" /> 
    <Message Text="CLEAN COMPLETED." Importance="high" /> 
    </Target> 

    <Target Name="Init" DependsOnTargets="Clean"> 
    <MakeDir Directories="@(BuildArtifacts)" /> 
    <Message Text="BUILDARTIFACTS DIRECTORY HAS BEEN CREATED." Importance="high" /> 
    </Target> 

    <Target Name="Compile" DependsOnTargets="Init"> 
    <SvnInfo RepositoryPath="https://cnfglfcdv01/svn/Primary/Users/kdonde/" 
      UserName="user" 
      Password="password" 
      ToolPath=".\ThirdParty\Tools\SlikSvn" > 

     <!-- 2 --> 
     <Output TaskParameter="Revision" PropertyName="RevisionNumber" /> 
    </SvnInfo> 
    <Message Text="SVN INFO HAS BEEN EXECUTED." Importance="high" /> 
    <Message Text="$(RevisionNumber) :================" Importance="high" /> 
    <Message Text="$(MSBuildCommunityTasksPath) :================" Importance="high" /> 


    <!-- 3 --> 
    <FileUpdate Files=".\Fit4Less.OnlineSales\Properties\AssemblyInfo.cs" 
      Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" 
      ReplacementText="$1.$2.$3.$(RevisionNumber)" /> 
    <Message Text="AssemblyInfo.cs has been updated with version info." /> 

    <MSBuild Projects="@(SolutionFile)" 
     Targets="Rebuild" 
     Properties="OutDir=%(BuildArtifacts.FullPath);Configuration=$(Configuration)" /> 
    <Message Text="BUILD HAS COMPLETED." 
     Importance="high" /> 
    </Target> 


    <!-- 4 --> 
    <Target Name="Deploy" 
     DependsOnTargets="Compile"> 
    <AssemblyInfoReader Path=".\OnlineSales\Properties\AssemblyInfo.cs" 
        Property="AssemblyVersion" > 
     <Output TaskParameter="Value" 
      ItemName="Version" /> 
    </AssemblyInfoReader> 
    <Message Text="ASSEMBLYINFOREADER HAS COMPLETED." 
     Importance="high" /> 
    </Target> 



    <Target Name="Test" DependsOnTargets ="Compile"> 
    <Exec Command="@(NUnit) @(TestAssembly) /[email protected](TestResults)" /> 
    <Message Text="UNIT TESTS HAVE COMPLETED." 
     Importance="high" /> 
    </Target> 

</Project> 
+0

对于指向安装的任务程序集('$(MSBuildCommunityTasksPath)MSBuild.Community.Tasks.dll')的SvnInfo,应具有与Using AssemblyInfoReader中的路径一样的'UsingTask'。 –

回答

4

要与相对路径到组装引用的MSBuild社区任务,尝试在顶部添加此:

<PropertyGroup> 
    <MSBuildCommunityTasksPath>.</MSBuildCommunityTasksPath> 
</PropertyGroup> 
<Import Project="packages\MSBuildTasks.1.4.0.56\tools\MSBuild.Community.Tasks.Targets" /> 

Import在所有UsingTask的带来该点到组装在$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll其中MSBuildCommunityTasksPath是相对于`.Targets'项目文件。

+0

这是正确的答案。设置属性至关重要,如果未设置,则默认按照文件MSBuild.Community.Tasks.Targets中的逻辑在C:\ Program Files中进行搜索。 –

2

我已经在源代码控制下的目录结构:

\BuildScripts\Bin\ 
\BuildScripts\Scripts\ 

我安装我的本地计算机上的MSBuild社区任务,我感动了所有相关的文件到\ BuildScripts \ BIN \文件夹中。在脚本中,我正在使用MSBuild.Community.Tasks.Targets文件的相对路径。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <!-- Import Community Tasks --> 
    <Import Project="..\Bin\MSBuild.Community.Tasks.Targets"/> 

    <Target Name="Compile"> 
    <SvnInfo RepositoryPath="https://cnfglfcdv01/svn/Primary/Users/kdonde/" 
      UserName="user" 
      Password="password" 
      ToolPath=".\ThirdParty\Tools\SlikSvn" > 

     <Output TaskParameter="Revision" PropertyName="RevisionNumber" /> 
    </SvnInfo> 
    <Message Text="SVN INFO HAS BEEN EXECUTED." Importance="high" /> 
    <Message Text="$(RevisionNumber) :================" Importance="high" /> 
    <Message Text="$(MSBuildCommunityTasksPath) :================" Importance="high" /> 
</Target> 
</Project> 

在构建服务器上,构建之前,我从源代码管理中获取BuildScripts文件夹。然后我在BuildScripts \ Scripts文件夹中执行我的脚本,它正在工作。这也适用于我们团队中其他开发人员的本地工作,无需安装MsBuild社区任务。

+0

这不就是我在做什么......我不明白你上面提到的与我正在做的不同吗?有什么不同?还是你只是确认我在做什么应该工作? –

+0

我试图向你展示工作样品,它对我是如何工作的。它也应该以这种方式为你工作。 – Ludwo