【问题标题】:referencing msbuild community tasks through a relative path通过相对路径引用 msbuild 社区任务
【发布时间】:2011-11-24 22:15:30
【问题描述】:

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

我想从 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) /xml=@(TestResults)" />
    <Message Text="UNIT TESTS HAVE COMPLETED." 
         Importance="high" />
  </Target>

</Project>

【问题讨论】:

标签: msbuild continuous-integration msbuildcommunitytasks


【解决方案1】:

要使用相对路径到程序集引用 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' 项目文件相关。

【讨论】:

  • 这是正确的答案。设置属性很关键,如果不设置,则默认按照文件 MSBuild.Community.Tasks.Targets 中的逻辑在 C:\Program Files 中搜索。
【解决方案2】:

我在源代码管理上有以下目录结构:

\BuildScripts\Bin\
\BuildScripts\Scripts\

我在本地 PC 上安装了 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 社区任务。

【讨论】:

  • 这不是我正在做的事情吗...我看不出你上面提到的与我正在做的事情有什么不同?有什么不同?还是您只是在确认我正在做的事情应该有效?
  • 我试图通过工作示例向您展示它对我的工作方式。它也应该以这种方式为您工作。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2012-06-30
  • 1970-01-01
相关资源
最近更新 更多