如何覆盖MSBUILD中.NET引用的CopyLocal(Private)设置

我已经摔了几天,经过大量的search,我找不到我应该走的路。

我想要做的是build立一个MSBUILD项目,将build立我们的整个.NET应用程序(常见的8个解决scheme,也许250个项目之间分裂)与许多设置从个别项目文件覆盖,使debugging版本为了我自己。

具体来说,我想要build立我们的发布configuration与优化closures和完整的debugging信息/ pdbs生成。 另外,为了减less我们目前超长的编译时间,我想为每个项目的每个引用“复制本地”(或者在实际的proj文件xml中是私有的)false。

第一件事情相当简单,我可以相当容易地重写一个项目级别的属性(你甚至可以从MSBuild命令行使用/ p来做到这一点),但是我无法弄清楚如何覆盖引用的一个属性。 我已经尝试了几个在StackOverflow和Web上看到的东西,但没有任何解决scheme。

我可以通过修改Microsoft.Common.targets来完成我想要的function,注释_CopyFilesMarkedCopyLocal目标中的代码完全跳过这些文件的复制。 但我不想改变我的全局configuration,并在任何情况下都这样做。 我创build了我自己的替代目标文件 – 如果我改变一个单独的项目文件指向它的工作原理 – 但我不知道如何指定这用于顶层(我的.proj文件,只是build立全部8种解决scheme)。 这将是非常好的,如果我能以某种方式覆盖_CopyFilesMarkedCopyLocal顶级目标,以便如果MS更改默认目标文件我的构build没有搞砸,但我不知道如何使这个工作。

最好的事情是,如果有一种方法可以重写参考级别的属性,比如你可以投影级别属性,而不必重写/重写构build目标的东西 – 但我没有find任何信息表明这是可能的。

在此先感谢您的帮助。

PS我不可能只是通过所有的项目文件并改变它们; 我需要一个解决scheme,保留现有的代码。

尝试这个:

CustomAfterMicrosoftCommonTargets设置为C:\ foo \ filter.targets (或任何你命名的文件),并使filter.targets为:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemDefinitionGroup> <Reference> <Private>False</Private> </Reference> </ItemDefinitionGroup> </Project> 

在像filter.targets这样的文件中添加一个目标:

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

这将重新创build@(引用)列表,使元数据“Private”设置为false,这将确保引用不会被复制。 然后运行生成你的解决scheme或项目的属性$(CustomAfterMicrosoftCommonTargets)设置为此filter.targets文件的path。

 msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets 

这样,在构build项目之前,BeforeBuild目标将被调用,并且所有的引用都将被相应地设置。 如果您想要更多地控制Private是否应该为false或true,则可以修改BeforeBuild目标并通过属性来控制它。

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