gpt4 book ai didi

.net - 如何从 MSBUILD 覆盖 .NET 中引用的 CopyLocal(私有(private))设置

转载 作者:行者123 更新时间:2023-12-03 10:39:25 24 4
gpt4 key购买 nike

我已经为此苦苦挣扎了几天,经过大量搜索后,我找不到应该走的路。

我想要做的是设置一个 MSBUILD 项目,它将构建我们的整个 .NET 应用程序(8 个解决方案的 constst,并且可能有 250 个项目在它们之间拆分),其中一些设置从单个项目文件中覆盖以进行调试构建为了我自己。

具体来说,我想构建我们的发布配置,关闭优化并生成完整的调试信息/pdb。此外,为了减少我们目前超长的构建时间,我希望每个项目的每个引用都“复制本地”(或实际项目文件 xml 中的私有(private))为 false。

第一件事相当简单,我可以很容易地覆盖项目级别的属性(您甚至可以使用/p 从 MSBuild 命令行执行此操作),但我不知道如何覆盖引用上的属性。我已经尝试了一些我在 StackOverflow 和网络上看到的东西,但还没有一个解决方案。

我可以通过更改 Microsoft.Common.targets 来做我想做的事,注释掉 _CopyFilesMarkedCopyLocal 目标中的代码会完全跳过这些文件的复制。但我不想改变我的全局配置并在所有情况下都这样做。我创建了自己的备用目标文件——如果我改变一个单独的项目文件以指向它,它就可以工作——但我不知道如何指定它在顶层使用(我的 .proj 文件只是构建所有 8 个解决方案)。如果我能以某种方式仅覆盖顶层的 _CopyFilesMarkedCopyLocal 目标,那就太好了,这样如果 MS 更改了默认目标文件,我的构建就不会搞砸,但我也不知道如何使它工作。

最好的可能是如果有一种方法可以覆盖引用级别属性,就像您可以项目级别属性一样,而不必重写/覆盖构建目标的东西——但我没有发现任何信息表明这是可能的。

提前感谢您对此的任何帮助。

附言我实际上不可能浏览所有项目文件并更改它们;我需要一个使现有代码保持原样的解决方案。

最佳答案

在 filter.targets 之类的文件中添加一个目标:

<Target Name="BeforeBuild">
<ItemGroup>
<ReferenceNew Include="@(Reference)">
<Private>False</Private>
</ReferenceNew>
<Reference Remove="@(Reference)"/>
<Reference Include="@(ReferenceNew)"/>
</ItemGroup>
</Target>

这将重新创建 @(Reference) 列表以将元数据“Private”设置为 false,这将确保不会复制引用。
然后运行构建您的解决方案或项目,并将属性 $(CustomAfterMicrosoftCommonTargets) 设置为此 filter.targets 文件的路径。
msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets

这样,在构建项目之前将调用 BeforeBuild 目标,并相应地设置所有引用。如果您想更好地控制 Private 何时或是否应该为 false 或 true,您可以更改 BeforeBuild 目标并通过属性进行控制。

编辑:在 BeforeBuild 目标中设置元数据可能有更好的方法。

关于.net - 如何从 MSBUILD 覆盖 .NET 中引用的 CopyLocal(私有(private))设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com