如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标?

2024-05-06

我有一个我部分拥有的代码生成器工具,现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架,我试图弄清楚如何使 MSBuild 目标仅在每个目标中生成一次代码无论列出了多少个目标框架,都将运行构建,并让每个目标框架的编译等待代码生成完成。

我目前将其以 TargetFramework 的特定值为条件。例如,Condition="'netstandard2.0' == '$(TargetFramework)'".

这可以避免同时为每个目标框架启动代码生成工具,然后在进程尝试创建/更新相同文件时出现访问被拒绝错误。

然而,其他目标框架会直接尝试编译而不等待代码生成完成,并且在该代码不存在的情况下失败。

我希望每次构建项目时只生成一次代码,并且仅在完成后才开始对每个目标框架进行编译。

每次运行构建时都需要运行它,以防输入发生更改并生成不同的代码。

注意:目前我忽略了一种情况#if FrameworkSpecificDefine用于向代码生成器提供不同的输入代码,以便不同的目标框架导致代码生成器的不同输出。目前,我认为代码生成器的输出在所有目标框架中都是相同且有效的。

Update:在查找 MSBuild 拆分为 TargetFramework 特定构建之前发生的 Target 之后,我可以在之前挂钩构建,我在 VS 中的详细构建输出中看到了这一点:

1>Target _SetBuildInnerTarget:
1>Target _ComputeTargetFrameworkItems:
1>Target DispatchToInnerBuilds:
1>  Using "MSBuild" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>  Task "MSBuild"
1>    Additional Properties for project "ProjectA.csproj":
1>      TargetFramework=netstandard2.0
1>    Additional Properties for project "ProjectA.csproj":
1>      TargetFramework=net47

然后我将目标设定为BeforeTargets="DispatchToInnerBuilds"它在专门设置 TargetFramework 的单独构建之前运行,并且似乎完全满足我的需求。

(添加到BuildDependsOn属性似乎不再起作用:添加在 Visual Studio 2017 RC 中生成 .NET Core 项目后运行的 msbuild 任务 https://stackoverflow.com/questions/41473503/add-a-msbuild-task-that-runs-after-building-a-net-core-project-in-visual-studio;我怀疑 Microsoft.Common.targets 稍后会以新的 csproj 格式进行评估,并且您在项目文件中执行的任何附加属性都会被 Microsoft.Common.targets 覆盖。)


On 单一目标框架我只用BeforeTargets="PreBuildEvent":

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <Target Name="GenerateVersionInfo" BeforeTargets="PreBuildEvent">
    <Exec Command="your custom command" />
  </Target>
</Project>

on 多目标框架 I use BeforeTargets="DispatchToInnerBuilds"

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
  </PropertyGroup>
  <Target Name="GenerateVersionInfo" BeforeTargets="DispatchToInnerBuilds">
    <Exec Command="your custom command" />
  </Target>
</Project>

所以我的自定义命令在每次构建之前只执行一次。如果你使用InitialTargets,该命令执行的次数不止一次!例如,如果您保存项目!

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

如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何在Eclipse中配置Tesseract进行Android开发?

    我已经从事 Android 工作 6 个月了 至此我对Android开发有了基本的了解 现在我想使用 Tesseract 开发一个 OCR Android 应用程序 为此 我从 Tesseract 下载了 android ndk r6b t
  • 在 less 中为 twitter bootstrap 的所有选择器添加前缀

    我想开始学习 Twitter Bootstrap 并将其合并到我的网站中 从表单元素开始 但如果我按原样包含它 它会破坏网站的其余部分 我想为所有选择器添加前缀 以便我可以逐渐添加引导样式的内容 如下所示 div class bootstr
  • 将密码存储到sql中的最佳方法

    在我当前的 C Windows 应用程序中 密码已以纯文本形式存储 这显然不好 所以我只想知道加密密码并存储到 SQL Server 中的最佳方法是什么 我读到使用哈希 盐更好 但我觉得sql 2005中的 EncryptByPassPhr
  • Hadoop:读取ORC文件并放入RDBMS中?

    我有一个以 ORC 文件格式存储的配置单元表 我想将数据导出到 Teradata 数据库 我研究了 sqoop 但找不到导出 ORC 文件的方法 有没有办法让 sqoop 为 ORC 工作 或者有什么其他工具可以用来导出数据 Thanks
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 如何检查特定作业是否在quartz调度程序中运行#

    我正在使用石英调度程序根据触发器的用户输入来安排写入文件的作业 我想检查作业是否仍在 stop 方法中运行 如何检查作业是否仍在运行 public class JobScheduler static StdSchedulerFactory
  • 将 WebApp 授权给 ADFS 以访问 Dynamics CRM Web API

    我有一个 Web 应用程序需要与 Dynamics CRM 365 Web API 通信 Dynamics CRM 配置为 ADFS 上的依赖方 服务器是 Windows Server 2016 一切都在本地 而不是在 Azure 上 我为
  • 导入 org.ksoap2.SoapEnvelope 时遇到问题

    正在使用网络服务 从互联网上获取了一些示例代码 导入时出现一些错误 import org ksoap2 SoapEnvelope import org ksoap2 serialization SoapObject import org k
  • 如何从 CustomViewController 中更改 RootViewController(在 AppDelegate 中)?

    再会 我的应用程序具有在 AppDelegate 中加载的授权表单 SigninController 登录后 在 SigninController m 中检查 应该出现 TabBarController 作为应用程序的主视图 如何将控制器从
  • BigQuery 数据类型

    我正在开始一个新项目 只是想在定义表模式之前进行验证 BigQuery 是否支持以下以外的其他功能 string integer float boolean BigQuery 数据类型官方文档 https cloud google com
  • python 中打印变量和字符串

    好吧 我知道如何打印变量和字符串 但是我如何打印类似 我的字符串 card price 的内容 它是我的变量 我的意思是 这是我的代码 print I have and here I would like to print my varia
  • 如何在 Dart 中打印美元符号 $

    我实际上需要在 Dart 中在变量之前打印一个美元符号 例如 void main int dollars 42 print I have dollars I have 42 我希望输出为 我有 42 美元 我怎样才能做到这一点 谢谢 飞镖弦
  • Java:删除链表中的所有元素

    Java中如何删除链表中的所有元素without使用已经可用的clear 方法 这项练习的灵感来自于电话采访中收到的一个问题 说我可以用 C 来做这个 void DeleteAllElement ListElement head ListE
  • 用于分享帖子的 Yammers REST API

    我想使用 REST API 从我的业务应用程序共享帖子 不是发布新消息 而是共享现有帖子 有谁知道要使用哪个端点以及如何实现它 当您使用 Yammer API 创建新帖子时 请将参数 shared message id 与要共享的消息的 m
  • 为什么 justify-content 不以我的 div 为中心?

    我试图将两个 div 水平居中放在爸爸 div 内 爸爸 div 设置为flex direction column因为我希望子 div 一个在另一个之下 但位于页面的中心 justify content center 应该做但不起作用 我终
  • 如何注释 .tsx 文件中的属性?

    给出以下 JSX 代码 div div 我怎样才能注释掉className my class className my class 不起作用 className my class 不起作用 TS1005 expected className
  • 如何在Azure数据工厂中传递不记名令牌API

    我有一个 API 它具有授权和不记名令牌 我在邮递员中进行了测试 它正在工作 但是 当我在 ADF 中使用 Web 活动时 它不起作用 我在 URL 部分传递 url 创建新标头 输入授权并指定值 Bearer token 出现以下错误 E
  • 有没有办法找到哪些 .NET 类实现了某个接口?

    例如 如果我想查看我的 NET 选项用于实现 IList 或 IDictionary 有没有办法找到它 例如在 MSDN 文档中 我认为可以使用反射器 http www red gate com products reflector
  • 玩笑测试因 refs 和 Form 失败

    我有一个搜索栏组件 如下所示 render const onChangeTextInput this props return
  • 如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标?

    我有一个我部分拥有的代码生成器工具 现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架 我试图弄清楚如何使 MSBuild 目标仅在每个目标中生成一次代码无论列出了多少个目标框架 都将运行构建 并让每个目标框架的编译等待代