针对C#解决方案的MSBuild(如版本)的自定义

时间:2015-01-22 19:45:14

标签: c# visual-studio-2012 command-line msbuild

我认为最终结果将是"它不能轻易完成",但看起来应该如此。我有一个我正在做的个人项目。我不想手动(甚至在脚本中)更改所有assembly.cs文件中的版本,公司,版权和所有内容,并希望所有这些都在脚本或文件中我可以当我想更新版本时,更改(因此脚本保持相同)。但似乎MSBuild主要是在Visual Studio"中指定的"版本。我只是讨厌拥有这些文件的所有历史记录,我只更改版本,甚至可能犯错,因为这个项目将继续变得越来越大。我希望能够向Visual Studio中添加一个新项目,并在我的powershell脚本中使用任何命令行,只需说"编译它,但是给它这个公司名称和这个文件版本而不是任何是在代码文件中列出"。

谷歌在这方面并未取得丰硕成果。我甚至发现很难将文件构建到特定文件夹。到目前为止,我必须确保我的所有项目都是2个文件夹深,并且可以说它们构建它们.... \但我希望能够随意更改它,如果我喜欢并拥有它们如果我愿意,可以在别处建造。

MSBuild或许不是可行的方法吗?还有什么方法可以构建视觉工作室,从命令行会更好吗?最后我还想用wix自动构建安装,并且能够将其版本与二进制版本匹配。

谢谢

1 个答案:

答案 0 :(得分:0)

由于csproj是xml,你可以使用XmlUpdate" helpers"在进行构建之前修改csproj文件中的值。

对于其他文件,您可以使用其他一些任务来完成这项工作。

这是一个有用的目标:

http://msbuildtasks.tigris.org/和/或https://github.com/loresoft/msbuildtasks具有(FileUpdate(以及SvnVersion任务,如果这是您的Source-Control))任务。

<Target Name="BeforeBuild_VersionTagIt_Target">

    <ItemGroup>
        <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
    </ItemGroup>

    <!--
    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
        <Output TaskParameter="Revision" PropertyName="MyRevision" />
    </SvnVersion>
    -->

    <PropertyGroup>
        <MyRevision>9999</MyRevision>
    </PropertyGroup>    


    <FileUpdate Files="@(AssemblyInfoFiles)"
            Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(MyRevision)" />

</Target>

以下是操作csproj(xml)的示例。

How to add a linked file to a csproj file with MSBuild. (3.5 Framework)

但基本上,当你构建时,你可以将所有重复的东西放在msbuild定义文件中(通常使用扩展名.proj或.msbuild)...并调用msbuild.exe MyFile.proj。

在.proj文件中,您将引用您的.sln文件。

例如:

$(WorkingCheckout)将是一个变量(此处未定义)...其中包含您从源代码控制中获取hte代码副本的目录。

  <Target Name="BuildIt" >
    <MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
      <Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
    </MSBuild>
    <Message Text="BuildItUp completed" />
  </Target>

以下是更完整的例子。 你可以将其保存为&#34; MyBuild.proj&#34;然后致电

"msbuild.exe" "MyBuild.proj".

启动.proj代码。 (注意,我没有为FileUpdate任务导入库)

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
  <PropertyGroup>
    <!-- Always declare some kind of "base directory" and then work off of that in the majority of cases  -->
    <WorkingCheckout>.</WorkingCheckout>
  </PropertyGroup>

  <Target Name="AllTargetsWrapped">


    <CallTarget Targets="BeforeBuild_VersionTagIt_Target" />
    <CallTarget Targets="BuildItUp" />

  </Target>


  <Target Name="BuildItUp" >
    <MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
      <Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
    </MSBuild>
    <Message Text="BuildItUp completed" />
  </Target>


<Target Name="BeforeBuild_VersionTagIt_Target">

    <ItemGroup>
        <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
    </ItemGroup>

    <!--
    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
        <Output TaskParameter="Revision" PropertyName="MyRevision" />
    </SvnVersion>
    -->

    <PropertyGroup>
        <MyRevision>9999</MyRevision>
    </PropertyGroup>    


    <FileUpdate Files="@(AssemblyInfoFiles)"
            Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(MyRevision)" />

</Target>



</Project>

为了增强上述功能,您将创建一个新目标,该目标将在&#34; BeforeBuild_VersionTagIt_Target&#34;之前运行,它将从源代码控制中提取您的代码并将其放入$(WorkingCheckout)文件夹中。

基本步骤如下:1。从Source-Control中检出代码。 2.运行改变AssemblyVersion的目标(以及你想要操作的任何其他东西)和3.构建.sln文件。

这是.proj文件的基础知识。你可以做得更多。通常使用已经存在的辅助库。