【问题标题】:Customizations on MSBuild (like version) for a C# solution针对 C# 解决方案的 MSBuild(类似版本)的自定义
【发布时间】:2015-01-22 19:45:13
【问题描述】:

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

Google 在这方面并没有被证明是卓有成效的。我什至发现很难将我的文件构建到特定文件夹。到目前为止,我必须确保我的所有项目都是 2 个文件夹深,并且能够说在 ....\ 上构建它们,但如果我愿意,我希望能够随机更改它并将它们构建在其他地方如果我愿意的话。

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

谢谢

【问题讨论】:

  • 似乎 MSBuild 主要是“Visual Studio 中指定的构建”,实际上并非如此。你可能会这么想,因为你对它的理解不够好,或者因为你没有足够地使用它,或者因为你只是通过 VS 或它们的组合使用它。但它非常强大,例如参见 granadcoder 的答案。其他示例:由于您使用 C#,因此您始终可以编写 C# 来执行此类任务并直接调用它或作为来自 MsBuild 的自定义任务,它有时比必须弄清楚 msbuild 是如何做的事情要快。
  • 我认为至少你可以对有人花时间帮助你的回答表示尊重和赞赏。

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


【解决方案1】:

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

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

这是一个有用的目标:

<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>

所以下面是更完整的例子。 您可以将此保存为“MyBuild.proj”,然后调用

"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>

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

然后,基本步骤将是: 1. 从 Source-Control 签出代码。 2. 运行更改 AssemblyVersion 的目标(以及您想要操作的任何其他内容)和 3. 构建 .sln 文件。

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

【讨论】:

  • 想知道他甚至没有发表评论。 +1
  • 我猜 SOF 的起起落落。感谢您的关注。
  • 从未收到已回答的通知。所以,我从来没有看过。收到有关@Kasrak 回复的通知。无意粗鲁。
  • 是的,这就是为什么我尽量不要飞得太高或太低。当有很多未知数时,尽量不要考虑最坏的情况。有可能,将这个(或其中一个)答案标记为“答案”,这样它就不会继续显示在“未回答”的 SOF 查询中。有些人故意寻找没有答案的人试图提供帮助。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多