问题标签 [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.
msbuild - 自定义道具/目标的 MSBuild 设计实践
我有一个 NuGet 包,我正在使用自定义 props/targets 文件,我想知道在定义和覆盖方面如何处理许多属性、项目和目标的最佳实践。
将所有属性直接放在我的MyNuGetPackage.targets
文件中并且根本不使用它会更好MyNuGetPackage.props
吗,像这样?
UseMyTarget
还是在.props
文件中无条件地定义并将目标保留在 .targets 文件中是更好的做法?
如果我需要捕获 Microsoft 或其他人为其设置默认值的属性,这两种方法都会失效。例如:
如果我在 中定义它.props
,OutputPath
可能尚未设置...
另一方面,许多作者似乎只使用.targets
自己......所以我最好只为我的依赖事物做这样的事情.targets
而不打扰.props
文件吗?
微软自己的 MSBuild 道具/目标的做法似乎根本不遵循任何类型的标准/约定。
我确实希望允许消费项目能够.props/.targets
通过设置Properties/Items/Targets
自己来改变我的行为。
c# - 如何在文件更改时使用 Target Copy 复制文件
此代码在构建之前运行。但是我想在调试文件更改时执行此操作。有可能吗?
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 键启动。
欢迎任何想法。
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 中运行应用程序时执行。条件可能有效,但它可能是什么?
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”。
到目前为止我已经尝试过:
- 最初是在 PropertyGroup 中传递 ApplicationId 值。它没有帮助。
- 所以硬编码代码中看到的值,Value="SetAValue" 仍然没有将密钥添加到 appsetting。
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 库解决方案上完成发布操作后,如何执行目标?
编辑: 这提出了另一个问题。当我发布时,我得到这个输出:
为什么它两次运行构建阶段?
.net-core - 在解决方案中只运行一次预构建步骤。点网核心
有没有办法在每个解决方案构建中只运行一次预构建目标。
如果构建了解决方案中的任何项目,我希望构建此目标。如果这个目标可以保存在目录构建目标文件中,我真的更喜欢。
还有一种方法可以配置为仅在本地开发环境中而不是在 CI 环境中运行此目标吗?
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
?
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
- 这是Microsoft 在“如何:增量构建”中描述的配置
- 我收到
MSBuild
错误提示找不到源文件
- 我收到
- 相同的配置,使用
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的性能报告摘录:
任何人都知道我是否/如何让我的配置执行最少的操作?
visual-studio - MSBuild :删除以前的ed 目标依赖
在我的 csproj 中,我正在导入一个非常大的大量使用的目标文件(我现在不允许分解它)。但是,此目标文件使用 AfterTargets='Build' 设置各种目标依赖项/顺序。
在我导入这个大型目标文件的 csproj 中,我想删除一些 After build 目标依赖项。例如,假设导入了以下目标:
如何Target1
从执行中删除在 csproj 中构建后我将其导入。什么是实现这一目标的好方法?