在项目构建过程中,如何防止外部MSBUILD文件(通过Visual Studio)缓存?

StackOverflow https://stackoverflow.com/questions/2903803

  •  04-10-2019
  •  | 
  •  

我的解决方案中有一个项目,该项目是从C#图书馆项目开始的。它在代码方面对它没有任何兴趣,它仅用作我解决方案中其他项目的依赖性,以确保首先构建它。构建此项目的副作用之一是创建了一个共享汇编。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文件并运行构建。

问题在于,修改和保存版本ininfo.targets文件并重建解决方案没有效果 - 项目文件使用.targets文件中的值,就像打开项目时一样。即使卸载和重新加载项目也没有影响。为了获得新值,我需要关闭Visual Studio并重新打开它(或重新加载解决方案)。

如何设置此问题,以使配置在.csproj文件外部,而不是在构建之间缓存?

有帮助吗?

解决方案

我刚刚回答了这似乎是一个类似的问题。

如何关闭Visual Studio中的构建定义的缓存

希望这也与您的问题有关。

其他提示

据我所知,你不能。 Visual Studio不使用“真实” MSBUILD,而是使用与msbuild.exe非常相似的内部构建引擎,但仍然存在一些微妙的差异。此构建引擎可以缓存目标,因此更改某些内容后,您必须重新启动VS。我相信,它甚至是在某个地方记录的,而且没有已知的解决方法(我大约一年前搜索了它,没有发现)。

您可能会强迫VS通过VS API重新加载目标 - 因此,您必须创建(或查找)自定义附加组件来执行此操作。

另一个选项是使用.targets文件以外的其他内容来存储您的配置。例如,您可以使用纯文本文件并使用MSBuild解析(不是那么优雅,但应该起作用)。

UPD。

那就是我前一段时间所做的。 MSBUILD通过exec调用workingDirectory =“ $(solutiondir)”的外部工具,该工具“知道”有关文件名,位置等的所有约定,因此工作目录足以完成工作。其他配置数据存储在外部工具的配置中,因此缓存没有问题。

另外,看看 这个问题 关于从文件中读取项目。我想,这更好地适合您的需求。

通过修改项目文件,包括自定义MSBUILD文件并使该项目无效,然后重新加载项目,让它保持卸载,然后卸载,然后修复项目文件并重新加载,我取得了一些间歇性的成功。

有时它可以工作,有时效果不佳,但是比重新启动Visual Studio更好。

如果您需要一种快速而肮脏的方法来修复它,则可以简单地重新加载解决方案(通过 https://stackoverflow.com/a/6877056/182371).

您可以通过关闭打开解决方案文件或在外部编辑器中添加保存来做到这一点(然后,当您返回到VS时,它将询问是否要重新加载)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top