如何始终在 MSBuild 中执行目标

2023-12-14

我有一个 MSBuild 文件,它在编译应用程序之前操作 AssemblyInfo 文件。在构建结束时,它会恢复 AssemblyInfo 文件。它通过备份文件、操作文件,然后在构建时间后恢复文件来实现此目的。

除非在构建过程中发生错误,否则这工作得相当好。然后它不会恢复原始文件。有没有办法让 MSBuild 在构建结束时执行目标,无论成功还是失败?


根据您对原始问题的最后评论,我将采取另一种方法,并忘记您当前采用的方法。您应该知道您的版本信息不必位于 AssemblyInfo.cs 文件中。它可以位于任何代码文件中,只要您仅分别定义一次 AssemblyVersion 和 AssemblyFileVersion 属性即可。话虽这么说,我要做的是按照以下步骤操作:

  1. 从 AssemblyInfo.cs 中删除 AssemblyVersion 与 AssemblyFileVersion
  2. 创建一个新文件,将其命名为您想要的任何名称,在我的例子中,我将其放在 Properties\VersionInfo.cs 中。不要将此文件添加到项目中。
  3. 编辑项目文件以将该文件包含到仅在需要时才编译的文件列表中

让我们对#3 进行一些扩展。当您生成 .NET 项目时,该项目本身就是一个 MSBuild 文件。在该文件中,您将找到一个声明为 Compile 的项目。这是将发送到编译器进行编译的文件列表。您可以动态地包含/排除该列表中的文件。在您的情况下,仅当您在构建服务器上构建(或您定义的任何其他条件)时,您才需要包含 VersionInfo.cs 文件。对于此示例,我将该条件定义为项目是否在发布模式下构建。因此,对于发布模式,VersionInfo.cs 将被发送到编译器,而对于其他版本则不会。这是VersionInfo.cs的内容

版本信息.cs

[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]

为了将其挂接到构建过程中,您必须编辑项目文件。在该文件中,您将找到一个元素(可能超过 1 个,具体取决于项目类型)。您应该在那里添加类似于以下内容的目标。

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(Configuration)'=='Release' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

我在这里所做的就是定义一个目标 BeforeCompile,这是一个众所周知的目标,您可以覆盖它。看到这个MSDN 文章关于其他类似的目标。基本上,这是一个始终在调用编译器之前调用的目标。在此目标中,仅当 Configuration 属性设置为 release 时,我才将 VersionInfo.cs 添加到 Compile 项。您可以将该属性定义为您想要的任何内容。例如,如果您将 TFS 作为构建服务器,那么它可能是,

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(TeamFoundationServerUrl)'!='' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

因为我们知道TeamFoundationServerUrl只有在通过TFS构建时才被定义。

如果您正在从命令行构建,那么像这样

<Target Name="BeforeCompile">
  <ItemGroup Condition=" '$(IncludeVersionInfo)'=='true' ">
    <Compile Include="Properties\VersionInfo.cs" />
  </ItemGroup>
</Target>

当您构建项目时,只需执行 msbuild.exe YourProject.proj /p:IncludeVersion=true 即可。注意:这在构建解决方案时不起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何始终在 MSBuild 中执行目标 的相关文章

  • MSBUILD 使用 XML 文档文件构建项目

    这应该很容易 但我无法让它发挥作用 我有一个 Web 项目 它引用我的解决方案中的另一个项目 我们称之为 Project1 这两个项目都设置为创建 XML 文档文件 当我右键单击 Web 项目并在 Visual Studio 中构建时 我的
  • 无法为 Android 源代码创建 Xamarin 组件

    我已经使用了命令 xamarin component exe package C cmp AndroidComponent component 用于创建 Xamarin 组件 在构建示例 android 项目时 它显示以下错误 我已使用命令
  • 如何首先使用 msbuild 构建依赖项目

    我刚刚开始研究 msbuild 因为我想制作自己的构建脚本 目前 我可以创建仅编译一个项目的构建脚本 但如何处理依赖项 例如 如果我有两个使用这两个 msbuild 脚本构建的项目怎么办 项目A xml 项目B xml 如何告诉 msbui
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 英特尔编译器使用错误的标头

    我试图找出为什么Intel Compiler 18 0 已安装after我的 Visual Studio 2017 安装使用的头文件MSVC 而不是它自己的 因为它会导致错误 一个简单的 include
  • VSTS 构建失败并显示 MSB4184 路径不是合法形式

    我正在尝试使用 VSTS 中的构建系统来构建和部署 c net Web 应用程序 我创建了一个新的单项目解决方案 因为似乎没有任何方法可以指定在多项目解决方案中构建 部署哪个项目 并设置我的构建定义以指向这个新解决方案 我已将其设置为使用
  • 无法从用法推断方法的类型参数

    namespace TestLibrary TestFixture public class Class1 public delegate T Initializer
  • 如何设置 TeamCity NuGet 安装程序的 MSBuild 版本?

    我正在尝试使用以下命令恢复 NET Core 解决方案的 NuGet 包NuGet 安装程序 https confluence jetbrains com display TCD10 NuGet InstallerTeamCity 构建步骤
  • 动态设置 Web 应用程序项目的 IISUrl

    我有一个 Web 应用程序项目 我希望能够在完全独立的 IIS 站点上进行分支和开发 而不必每次都继续编辑 vbproj IISUrl 设置 我尝试添加一些标准属性的导入 以便我可以在 WAP 文件之外维护它们 但是当我在元素中引用它们时
  • MSBuild - 我可以编译子目录中的所有解决方案吗?

    MSBuild 中有没有一种方法可以编译指定父级下的文件夹 子文件夹和子 中的所有解决方案 我们的库附带了很多示例程序 我想添加到构建过程中 我们知道它们都会编译 您可以创建自己的targets for restore and build运
  • 如何在 MSBuild NuGet 包生成的 .nuspec 中注入自定义依赖项

    我正在尝试迁移到使用 MSBuildPack支持使用 csproj 生成项目 NuGet 包 其中在开发过程中使用本地 dll 来构建项目 但在使用 MSBuild 打包 项目时需要替换 交换它们以引用生成的 nuspec 中的外部 NuG
  • 当我没有指定 x64 平台而不是 AnyCPU 时,MSBuild 如何或为何选择 x64 平台?

    我在跑msbuild exe通过常规 PowerShell 控制台的 Rake 这是从诊断级别运行打印的命令 C Windows Microsoft NET Framework v4 0 30319 msbuild exe D Projec
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • 为什么 64 位 MSBuild 加载 32 位扩展?

    我正在尝试在 64 位计算机上使用 MSBuild v4 0 构建一个项目 由于某种原因 MSBuild 正在尝试加载 32 位扩展 但我不明白为什么 为了演示该问题 我已将问题减少到最小 使用以下 MSBuild 项目文件
  • 使用 msbuild 复制所有文件和文件夹

    只是想知道是否有人可以帮助我编写一些我正在尝试编写的 msbuild 脚本 我想要做的是使用 msbuild 将所有文件和子文件夹从一个文件夹复制到另一个文件夹 ProjectName gt Source gt Tools gt Viewe
  • TFS MSBuild:$(ProjectDir) 空白或随机

    我有一个 vcproj 文件 其中包含一个简单的预构建事件 大致如下 Helpertask exe ProjectDir 这在开发人员 PC 上运行良好 但是当解决方案在 MSBuild 下的 TFS 2008 构建服务器上构建时 Proj
  • TeamCity:如何告诉 MSBuild 考虑发布配置文件参数?

    当我想使用发布配置文件编译我的项目时 我使用 MSBuild 步骤进行 TeamCity 构建配置 我的发布配置文件位于MyProject Properties PublishProfiles profile pubxml 我的配置文件 p
  • ASP.NET MVC - 用于管理的区域还是单独的 Web 应用程序?

    到目前为止我一直在使用MVC Area为了行政我的 mvc 应用程序的一部分 但最近我开始重新思考这个问题由于每个应用程序不能有多个表单身份验证配置 这已经成为一个问题 因为在最近的一个项目中 我想将身份验证 cookie 设置为不会对用户
  • 看起来 MSVS 11.0 Beta 破坏了 MSVS 10.0 安装

    安装 MSVS 11Beta 后 我的 MSVS 10 遇到了编译问题 现在 当我在 MSVS 10 中编译 C 项目 在 MSVS 10 中创建的项目 目标框架 3 5 时 出现错误MSB4216 MSB4028输出窗口中包含以下文本 1
  • 在 TFS 下的 CI 队列上构建时包未恢复(VS Online VS2015)

    我问过一个关于构建错误的问题 https stackoverflow com questions 34808954 build errors of missing packages in visual studio online并继续由我绝

随机推荐

  • Android 可点击 TextView,带有提示和图像,用于启动搜索对话框并显示所选结果

    我正在寻找一个示例 该示例展示了如何实现可单击的文本视图 该文本视图启动 Android 默认搜索对话框并显示选定的结果行 它应该与 Android 上的 Google 地图操作栏中的搜索字段具有相同的行为和设计 例如 左侧的放大镜图标 如
  • Java Arraylist 数据提取

    您将如何提取数据 如下所示 我想从这个数组列表中提取 itemname Original number 12 itemname BBQ number 23 itemname CatchUp number 23 这个数组 Original 1
  • 使用 AppleScript 将邮件消息设置为纯文本

    我有一个 AppleScript 可以很好地整理信息并创建带有附件的电子邮件 我找不到脚本将消息格式设置为接收收件箱所需的 纯文本 而不是默认的 富文本 的方法 是否有 AppleScript 方法 或技巧 将消息格式设置为 纯文本 我在尝
  • Tensorflow:如何在 python 中编写带有梯度的操作?

    我想用 python 编写一个 TensorFlow 操作 但我希望它是可微的 能够计算梯度 这个问题询问如何在 python 中编写操作 答案建议使用 py func 没有梯度 Tensorflow 用 Python 编写操作 TF 文档
  • Lumia Imaging SDK 图像混合创建分隔线

    我正在尝试使用 Lumia Imaging SDK 创建平铺背景JpegTools BlendAsync 方法 我循环调用该方法来合并所有平铺图像 该方法有效 但输出图像中存在不需要的线条 这些分隔线出现在单个图块图像的边界处 合并不干净
  • 当文件名有空格时,运行时 exec() 不运行命令[重复]

    这个问题在这里已经有答案了 我是 Java 新手 正在尝试将我的一个项目从 C 转换为 Java 以便将其与另一个 Java 程序结合起来 当我使用 Runtime exec 时 我很难获得正确的结果 我有以下程序段 Java 忽略处理给定
  • 在cpp中将字符串转换为_T

    我想转换string or char to the T但做不到 如果我写 tcscpy cmdline T hello world 它工作得很好 但是如果我写 char msg hello world tcscpy cmdline T ms
  • Spring中的数据库连接管理

    使用 Spring 框架时我们是否必须显式管理数据库资源 比如关闭所有打开的连接等 我读到 Spring 将开发人员从此类样板代码中解放出来 这是为了回答我在 Spring Web 应用程序中遇到的错误 org springframewor
  • 模式扩展以运行命令

    知道我能跑echo or mv扩展这样的模式 echo 0 9 A Z 我很想知道是否有办法执行相同的操作但运行命令 docker compose stop rm up d 上面的例子不起作用 但有某种方法可以实现这一点 分别运行 stop
  • 如何实现错误处理?

    我的 AutoIt 脚本生成了一个我想要处理的错误 将任何错误发送到自定义函数的方式也可以 在VBA中我使用OnErrorGoTo 但我无法在 AutoIt 中找到类似的东西 我的代码 Func Start While 1 If Proce
  • Apps 脚本 - 在 Google 表格上复制“将图像放入所选单元格”

    我目前正在通过 Apps 脚本功能在 Google 表格中插入多个图像插入图片 使用它 该函数将图像插入到单元格上方 而不是单元格内部 我可以通过单击三个点按钮 然后选择 将图像放入所选单元格 将该图像插入到单元格中 如下所示link 这里
  • 没有 Google Play 的 Android Admob

    我在网上找不到任何东西 有没有办法使用 AdMob SDK 通过我的应用程序获利 而无需将应用程序放在 Google Play 商店中 你们中有人可能知道吗 提前致谢 您无需通过 Google Play 分发应用程序即可使用 AdMob S
  • 嵌套查询 MVC LINQ

    我是新来的MVC and LINQ 目前 我在该项目上遇到了困难 并决定发布 My MVC View我想要实现的目标 Cut 1 20 2 40 Color 3 30 4 50 Perm 5 10 这是我的数据表的一些示例 ID Offer
  • 未捕获的类型错误未定义不是函数

    我是 JQuery 新手 不知道如何处理诸如未捕获之类的错误TypeError undefined is not a function 我不知道如何按顺序排列下面的 jQuery 代码 有人可以安排一下吗 model Mvc4 WebGri
  • 有没有办法从 Zend Framework 的引导程序重定向浏览器?

    我需要根据引导文件中的某些条件进行重定向 这是在定义前端控制器和路由之后完成的 我怎么做 我知道我可以简单地使用 header Location 重点是我需要使用 Router 来构建 URL 一年多后 我在 ZF 编程 我为你的问题找到了
  • 如何导航到 WP7 中的不同枢轴项目

    我有一个全景页面 其中有 3 个按钮 我已将一个数据透视页添加到具有 3 个数据透视项的同一项目中 当我单击全景页面中的按钮 1 时 它应该转到数据透视页面中的第一个数据透视项目 当我单击全景页面中的按钮 2 时 它应该转到数据透视页面中的
  • Boost asio - 分离不同的数据块

    想象一下 我们创建简单的客户端 服务器应用程序来将文件从客户端发送到服务器 我们使用boost asio 服务器开始监听 客户端连接到服务器 客户端发送文件名和文件内容 但服务器只接收字节流 服务器如何检测文件名结尾和文件内容开头 我的第一
  • 使用 appium 运行量角器脚本时:使用定位器找不到元素

    我正在使用 Ipad Air 模拟器 appium 和量角器来自动执行 Angular JS 站点的测试 但测试无法成功通过 它告诉我使用定位器找不到元素 我确信 xpath 与 Appium 生成的相同 这是我的配置文件 exports
  • Java JNDI API 用户无法通过多林设置对 AD 进行身份验证

    在我的测试环境中 我设置了两个活动目录林 A 和 B 每个林都有一个域控制器 并且林有两种信任设置 我有用户 森林中的用户 S 和森林中的用户 B 我已经使用 adfind exe 来测试 userA 和 userB 是否可以通过点击for
  • 如何始终在 MSBuild 中执行目标

    我有一个 MSBuild 文件 它在编译应用程序之前操作 AssemblyInfo 文件 在构建结束时 它会恢复 AssemblyInfo 文件 它通过备份文件 操作文件 然后在构建时间后恢复文件来实现此目的 除非在构建过程中发生错误 否则