我的解决方案中有一个项目,它起源于C#库项目。它在代码方面对它没有任何兴趣,它只是在我的解决方案中用作其他项目的依赖项,以确保它是首先构建的。构建此项目的一个副作用是创建一个共享的AssemblyInfo.cs,其中包含其他项目正在使用的版本号。
我通过在.csproj文件中添加以下内容来完成此操作:
<ItemGroup>
<None Include="Properties\AssemblyInfo.Shared.cs.in" />
<Compile Include="Properties\AssemblyInfo.Shared.cs" />
<None Include="VersionInfo.targets" />
</ItemGroup>
<Import Project="$(ProjectDir)VersionInfo.targets" />
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" />
引用的文件VersionInfo.targets包含以下内容:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!--
Some properties defining tool locations and the name of the
AssemblyInfo.Shared.cs.in file etc.
-->
</PropertyGroup>
<Target Name="UpdateSharedAssemblyInfo">
<!--
Uses the Exec task to run one of the tools to generate
AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in
and some of the other properties.
-->
</Target>
</Project>
VersionInfo.targets文件的内容可以简单地嵌入到.csproj文件中,但它是外部的,因为我试图将所有这些内容转换为项目模板。我希望模板的用户能够将新项目添加到解决方案,编辑VersionInfo.targets文件,然后运行构建。
问题是修改和保存VersionInfo.targets文件并重建解决方案没有任何效果 - 项目文件使用.targets文件中的值,就像打开项目时一样。即使卸载和重新加载项目也没有效果。为了获得新值,我需要关闭Visual Studio并重新打开它(或重新加载解决方案)。
如何设置它以使配置在.csproj文件外部而不在构建之间缓存?
答案 0 :(得分:5)
答案 1 :(得分:3)
据我所知,你不能。 Visual Studio没有使用“真正的”MSBuild,它使用的内部构建引擎与MSBuild.exe非常相似,但仍然有一些细微差别。此构建引擎缓存目标,因此您必须在更改某些内容后重新启动VS.我相信,它甚至记录在某个地方,并且没有已知的解决方法(我在大约一年前搜索过它并且一无所获)。
您可能会强制VS通过VS API重新加载目标 - 因此,您必须创建(或查找)自定义加载项才能执行此操作。
另一种选择是使用除.targets文件之外的其他内容来存储您的配置。例如,您可以使用纯文本文件并使用MSBuild进行解析(不是那么优雅,但它应该可以工作)。
UPD。
这就是我前段时间所做的。 MSBuild通过Exec使用WorkingDirectory =“$(SolutionDir)”调用外部工具,该工具“知道”有关文件名,位置等的所有约定,因此工作目录足以完成工作。其他配置数据存储在外部工具的配置中,因此缓存没有问题。
另外,请查看有关从文件中读取项目的this question。我想,更好地满足您的需求。
答案 2 :(得分:2)
通过修改包含自定义msbuild文件的项目文件并使其无效,然后重新加载项目,让它保持卸载,然后修复项目文件并重新加载,我获得了一些间歇性的成功。
有时它可以工作,有时它不会,但比重新启动Visual Studio更好。
答案 3 :(得分:1)
如果您需要快速而肮脏的方法来修复它,您可以简单地重新加载解决方案(通过https://stackoverflow.com/a/6877056/182371)。
您可以通过关闭打开解决方案文件或在外部编辑器中点击保存来执行此操作(然后当您返回VS时,它会询问您是否要重新加载)。