代码之家  ›  专栏  ›  技术社区  ›  Damian Powell

如何防止在项目生成期间(由Visual Studio)缓存外部msbuild文件?

  •  13
  • Damian Powell  · 技术社区  · 14 年前

    我的解决方案中有一个项目,它从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文件外部,而不是在生成之间缓存?

    4 回复  |  直到 8 年前
        1
  •  5
  •   Community CDub    7 年前

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

    How to turn off caching of build definitions in Visual studio

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

        2
  •  3
  •   Community CDub    7 年前

    据我所知,你不能。 Visual Studio未使用“real”msbuild,它使用的内部生成引擎的行为与msbuild.exe非常相似,但仍有一些细微的差异。这个构建引擎缓存目标,所以一旦你改变了什么,你就必须重新启动vs。我相信,它甚至被记录在某个地方,并且没有已知的解决方法(大约一年前我搜索了它,但什么也没有发现)。

    您可以通过vs-api强制vs重新加载目标——所以,您必须创建(或找到)一个自定义的附加组件来完成这项工作。

    另一个选项是使用.targets文件以外的其他文件来存储配置。例如,您可以使用一个纯文本文件,并使用msbuild对其进行分析(不是很优雅,但它应该可以工作)。

    UPD。

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

    另外,看看 this question 关于从文件中读取项目。我想,你需要更好的套房。

        3
  •  2
  •   Igor Zevaka    14 年前

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

    它有时工作,有时不工作,但比重新启动Visual Studio要好。

        4
  •  1
  •   Community CDub    7 年前

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

    您可以通过关闭打开解决方案文件或单击外部编辑器中的“保存”(然后当您返回到vs时,如果您想重新加载,它将asko)来完成此操作。