问题标签 [msbuild-target]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
378 浏览

msbuild - 自定义道具/目标的 MSBuild 设计实践

我有一个 NuGet 包,我正在使用自定义 props/targets 文件,我想知道在定义和覆盖方面如何处理许多属性、项目和目标的最佳实践。

将所有属性直接放在我的MyNuGetPackage.targets文件中并且根本不使用它会更好MyNuGetPackage.props吗,像这样?

UseMyTarget还是在.props文件中无条件地定义并将目标保留在 .targets 文件中是更好的做法?

如果我需要捕获 Microsoft 或其他人为其设置默认值的属性,这两种方法都会失效。例如:

如果我在 中定义它.propsOutputPath可能尚未设置...

另一方面,许多作者似乎只使用.targets自己......所以我最好只为我的依赖事物做这样的事情.targets而不打扰.props文件吗?

微软自己的 MSBuild 道具/目标的做法似乎根本不遵循任何类型的标准/约定。

我确实希望允许消费项目能够.props/.targets通过设置Properties/Items/Targets自己来改变我的行为。

0 投票
2 回答
67 浏览

c# - 如何在文件更改时使用 Target Copy 复制文件

此代码在构建之前运行。但是我想在调试文件更改时执行此操作。有可能吗?

0 投票
1 回答
778 浏览

msbuild - MsBuild SDK 项目风格:项目依赖有时会失败

在解决方案中,我将一些依赖项目配置为 SDK 样式项目:

  • Proj A 负责做一些例程作为 MsBuild 任务
  • 需要这样处理才能正确编译的 Proj B 项目
  • 任务在 Proj B 中配置为 MsBuild 目标,属性为 BeforeTargets="CoreCompile"。

基于该 Proj A 应该在运行 Proj B 编译任务之前完全编译。两个项目都有不同的编译目标(NetStandard20 和 Net462)。因此,我无法直接引用,而是通过将属性 AddSyntheticProjectReferencesForSolutionDependencies 设置为 false 来进行解决方案范围的项目依赖(否则 msbuild 会尝试强制项目依赖)。

在该设置中,MsBuild 有时会在编译时失败:Proj A 开始编译,但在 Proj B 运行任务时尚未及时完成。MSBuild 在 CI 机器上以 /m 键启动。

欢迎任何想法。

0 投票
1 回答
273 浏览

visual-studio - 在visual-studio中运行aspnet核心应用程序时,有没有办法连接npm任务?

我有一个集成了 WebpackDevMiddleware 的 Asp.Net 核心应用程序。该 WebpackDevMiddleware 为使用 NPM 命令构建的客户端资产提供服务。现在我想在项目运行时同时构建和服务这些客户端资产(JS/CSS)。

我认为明显的解决方案是在项目中添加(预构建事件命令行)并提供 npm 命令。不利的一面是,当我使用 dotnet core sdk 构建应用程序的 docker 映像时,它会要求提供它没有的节点环境。

这是我的 docker build 步骤,它无法识别与 dotnet build/publish 关联的 NPM 命令

现在我真正想要的是,我的目标只能在 VS 中运行应用程序时执行。条件可能有效,但它可能是什么?

0 投票
1 回答
354 浏览

c# - Xmlpoke 添加多个 appsettings 键不起作用

我有一个 Msbuild 目标,它通过将一个名为“ProjectID”的键添加到 web.config 的 appsetting 部分来成功执行。现在我通过向同一个 appsetting 部分再添加一个键“ApplicationId”来更改此目标的行为。日志显示 xmlpoke 对两者都执行。但只有 projectID 值被每次运行正确替换。

(摘自)PropertyGroup定义:

目标代码:

观察到的输出日志:

使用程序集“Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”中的“XmlPoke”任务。2019-06-25 08:37:13,202 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 任务“XmlPoke” 2019-06-25 08:37:13,203 [9]调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] -将“值”替换为“4424cc12-4368-45ad-ad5b-19e821eb91d4”。 2019-06-25 08:37:13,203 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] -做了 1 个替换. 2019-06-25 08:37:13,204 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 完成执行任务“XmlPoke”。2019-06-25 08:37:13,204 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] -任务“XmlPoke” 2019-06-25 08:37:13,204 [9]调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 进行了0 次替换。2019-06-25 08:37:13,204 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] -完成执行任务“XmlPoke”

到目前为止我已经尝试过:

  1. 最初是在 PropertyGroup 中传递 ApplicationId 值。它没有帮助。
  2. 所以硬编码代码中看到的值,Value="SetAValue" 仍然没有将密钥添加到 appsetting。
0 投票
1 回答
818 浏览

visual-studio - MSBuild 目标未在 NET Core 项目中运行

我正在使用 Visual Studio 2019、.NET Core 3.1

我创建了一个新项目并使用模板类库(.NET Core)

我在解决方案资源管理器中右键单击项目,然后单击编辑项目文件

并添加以下目标:

当我发布时......它几次达到这个目标,在输出窗格中我看到“这是一个测试”几次。

我希望这个目标在发布而不是构建之后执行。

这适用于 .NET Core Web API 解决方案,在 Publish 事件之前,我正在对已发布结果中包含的 Angular 项目执行ng 构建。

但是在类库中,即使我正在执行实际的发布,也不会执行发布 msbuild 目标。

所以...

此消息永远不会显示在我的输出窗格中。

此类库将发布到私有 NuGet 服务器,我想在发布操作完成后执行nuget 推送。一旦我让 msbuild 目标在正确的时间实际运行,我就可以轻松地执行一个命令来推送到 NuGet 服务器。

我在这里错过了什么吗?在 .NET Core 库解决方案上完成发布操作后,如何执行目标?

编辑: 这提出了另一个问题。当我发布时,我得到这个输出:

为什么它两次运行构建阶段?

0 投票
0 回答
77 浏览

.net-core - 在解决方案中只运行一次预构建步骤。点网核心

有没有办法在每个解决方案构建中只运行一次预构建目标。

如果构建了解决方案中的任何项目,我希望构建此目标。如果这个目标可以保存在目录构建目标文件中,我真的更喜欢。

还有一种方法可以配置为仅在本地开发环境中而不是在 CI 环境中运行此目标吗?

0 投票
1 回答
35 浏览

msbuild - 是否可以从 csproj.user 文件运行 AfterBuild 目标?

我想.csproj.user在我们的 git 存储库中未跟踪的文件中扩展我的本地构建过程。以前我使用过PostBuildEvent,但突然发现它不适用于变量:https ://github.com/dotnet/sdk/issues/677

两者都有效.csproj.csproj.user但不能有变量:

仅在放置在末尾.csproj而不是在.csproj.user

我也尝试用简单<Message>的而不是<Copy>相同的结果来调试它。

有没有办法让它在我的工作.csproj.user

0 投票
1 回答
466 浏览

c# - 将 MSBuild.exe cli 构建配置为增量运行,就像在 Visual Studio 构建中一样

语境

出于学习目的,我正在尝试从命令行使用文本编辑器和 MSBuild 进行开发。MSBuild.exe我的目标是通过跳过已经构建的依赖项,通过 cli尽可能快地构建。

如本链接所述:

在 Visual Studio 中构建项目与直接调用 MSBuild 时存在一些显着差异。[...] 在 MSBuild 中,当需要引用的项目时,实际上会发生构建;也就是说,它运行任务和工具,并生成输出。[...] 当 Visual Studio 构建找到引用的项目时,MSBuild 仅返回来自所引用项目的预期输出;它允许 Visual Studio 控制其他项目的构建。

问题陈述

我可以csproj像在 Visual Studio 中那样配置我的文件吗?

  • 给定一个csproj名为 A 的项目
    • 自上次构建以来,A 发生了变化
    • 并且 A 依赖于最新的项目 B (已经构建,自上次构建以来没有更改)
    • 并且 A 依赖于一个不是最新的项目 C(已经构建,但自上次构建以来发生了变化)
  • 当我MSBuild在项目 A 上运行时
  • 然后B没有重新编译
    • 并且 C 被重新编译
    • 并且 A 被重新编译

?

我试过的

我阅读了有关增量构建的信息。

我试图在我的文件中的节点Target底部附加以下 s :<Project>csproj

 

 

  • 相同的配置,使用Compile项目列表而不是CSFile项目列表
    • 我得到了更好的结果。但...
    • 我收到错误提示找不到依赖项

 

  • 相同的配置,但从MSBuild 的默认Build定义扩展
    • 我得到很多CS0103错误CS0234
      • CS0103: 当前上下文中不存在名称 'foobar'
      • CS0234:名称空间“bar”中不存在类型或名称空间名称“foo”(您是否缺少程序集引用?)

 

  • 相同的配置,使用$(TargetDir)$(TargetFileName)Output而不是$(TargetFileName)
    • 我没有错误了
    • 但是第二次构建,没有任何改变,仍然需要时间(在 120 个项目的解决方案中使用minimal冗长的14 秒csproj,其依赖项已经从第一次构建中构建)
    • 58 次出现Skipping target "Build" because all output files are up-to-date with respect to the input files.
    • 79 次出现Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
    • diagnostic以下是来自verbosity的性能报告摘录:

任何人都知道我是否/如何让我的配置执行最少的操作?

0 投票
1 回答
143 浏览

visual-studio - MSBuild :删除以前的ed 目标依赖

在我的 csproj 中,我正在导入一个非常大的大量使用的目标文件(我现在不允许分解它)。但是,此目标文件使用 AfterTargets='Build' 设置各种目标依赖项/顺序。

在我导入这个大型目标文件的 csproj 中,我想删除一些 After build 目标依赖项。例如,假设导入了以下目标:

如何Target1从执行中删除在 csproj 中构建后我将其导入。什么是实现这一目标的好方法?