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

蠕虫iii

我认为最终结果将是“不可能那么容易地完成”,但似乎应该如此。我有一个正在进行的个人项目。我不想手动(甚至在脚本中)更改版本,公司,版权以及所有assembly.cs文件上的所有内容,并且希望所有这些内容都可以在脚本或我可以更改的文件中进行(因此该脚本在大多数情况下都保持不变)。但似乎MSBuild主要是“ Visual Studio中指定的内部版本”。我只是不想拥有这些文件的所有历史记录,而只更改版本,甚至可能会犯一个错误,因为该项目将继续变得越来越大。一世'

Google尚未在此方面取得成果。我什至发现很难将文件构建到特定的文件夹中。到目前为止,我必须确保我的所有项目都位于2个文件夹中,并且能够说要在.... \上进行构建,但是如果我愿意,可以将其随机更改,并在其他位置进行构建如果我愿意的话。

MSBuild也许不是走的路?还有其他方法可以从命令行构建Visual Studio吗?最终,我还想使用wix自动构建安装程序,并使其版本与二进制版本匹配。

谢谢你

手榴弹编码器

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

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

这是一个有用的目标:

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

<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)的示例。

如何使用MSBuild将链接文件添加到csproj文件。(3.5框架)

但基本上,在构建时,可以将所有重复性内容放入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 Task的库)

<?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文件的基础。您可以做更多的事情。通常通过使用已经存在的帮助程序库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在解决方案上使用msbuild在某些项目上调用自定义目标

用于整个解决方案的自定义C#重构的Visual Studio 2017扩展

可以在自定义解决方案文件上调用MSBuild吗?

使解决方案中的每个csproj都针对不同的C#版本

自定义解决方案的Visual Studio配色方案

解决方案资源管理器中的C#多个自定义app.config文件

是否可以通过自定义跟踪解决方案代替Lighthouse,以针对现有Steam游戏的大型房间VR?

解决方案预设的项目文件上的自定义属性

如何以类似于 VS 解决方案(VS 自动构建依赖项)的方式管理自定义库?

Git合并冲突自定义自动解决方案

如何创建自定义动态DNS解决方案?

自定义 Visual Studio 解决方案

实施自定义Int + Range List解决方案

如何扩展自定义解决方案Xamarin的按钮

使用自定义深度测试的深度解决方案

MVC 6自定义Taghelper验证-解决方案

自定义加入条件。在ID上左加入并在小于日期的最近处。SQL或Python解决方案

如果在解决方案文件的任何项目中设置了某些MsBuild属性,是否有办法引发自定义编译错误?

如何为自定义日志记录解决方案正确创建性能测试?

自定义解决方案不存在于整个重新引导中

将自定义项模板添加到 Visual Studio 解决方案

同一解决方案的其他项目中的自定义追加程序

无法导入Dynamics CRM 2013自定义代码验证工具解决方案

巴基斯坦的Chrome扩展程序自定义付款解决方案?

如何为托管解决方案添加自定义站点地图区域/组/子区域?

HTML选择元素-自定义默认值?(跨浏览器解决方案)

将此自定义回合转换为更数学友好的解决方案

自定义实体未显示在默认解决方案屏幕中 - Dynamics CRM 2013

Laravel:使用Guzzle使用自定义Passport登录的解决方案