首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Visual studio中关闭生成定义的缓存

如何在Visual studio中关闭生成定义的缓存
EN

Stack Overflow用户
提问于 2011-02-07 16:18:16
回答 5查看 9.1K关注 0票数 24

在项目文件中,我导入了自己目标文件

代码语言:javascript
复制
<Import Project="Build\CopyDependencies.target" />

稍后,我从该目标文件调用target

代码语言:javascript
复制
<CallTarget Targets="CopyDependencies" UseResultsCache="false" />

如果我编辑CopyDependencies.target文件,我必须重新加载整个解决方案,然后对CopyDependencies.target所做的更改才会生效。我相信它是Visual Studio中的某种构建定义缓存?如果是,也许可以将其关闭?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-07 22:12:04

谢谢@KazR

下面是一个较小的解决方案,您可以将其插入到.csproj文件中

代码语言:javascript
复制
<Target Name="AfterBuild">
  <PropertyGroup>
    <TempProjectFile>Build.$([System.Guid]::NewGuid()).proj</TempProjectFile>
  </PropertyGroup>
  <Copy SourceFiles="Build.proj" DestinationFiles="$(TempProjectFile)" />
  <MSBuild Projects="$(TempProjectFile)" />
  <ItemGroup>
    <TempProjectFiles Include="Build.????????-????-????-????-????????????.proj"/>
  </ItemGroup>
  <Delete Files="@(TempProjectFiles)" />
</Target>

问题已解决

票数 15
EN

Stack Overflow用户

发布于 2011-06-03 01:15:06

我不知道您将如何禁用VS缓存,但是我可能有一个变通方法,允许您编辑构建目标,而不必重新加载解决方案。

您可以在项目文件中使用MSBuild任务来调用将CopyDependencies.target文件复制到CopyDependencies.RandomNumber.target的包装器目标,然后在新创建的文件中调用CopyDependencies目标,最后将其删除。

这将迫使VS在每次调用时重新加载目标,因为文件名不同。

下面是一个例子:

myProject.proj

将此代码添加到AfterBuild目标:

代码语言:javascript
复制
<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/>

Wrapper.target

这里我们有一个目标,它将在构建时复制实际的目标文件,并在其中调用所需的构建目标(我使用了一个仅在MSBuild 4.0中可用的内联c#任务):

代码语言:javascript
复制
    <UsingTask TaskName="RandomNumber" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <Number ParameterType="System.Int32" Output="true"/>
    </ParameterGroup>
    <Task>
        <Code Type="Fragment" Language="cs">
        <!-- CDATA -->
        Random rndGenerator = new Random();
        Number = rndGenerator.Next(Int32.MaxValue);
        <!-- CDATA -->
        </Code>
    </Task>
</UsingTask>

<Target Name="MyWrappedTarget">
    <Message Text="MyWrappedTarget target called"/>


    <RandomNumber>
        <Output TaskParameter="Number" PropertyName="FileNumber"/>
    </RandomNumber>

    <PropertyGroup>
        <CopiedTarget>inner.test.$(FileNumber).target</CopiedTarget>
    </PropertyGroup>

    <Copy SourceFiles="inner.test.target" DestinationFiles="$(CopiedTarget)"/>

    <MSBuild Projects="$(CopiedTarget)" Targets="_innerTestTarget"/>

    <Delete Files="$(CopiedTarget)"/>
</Target>

inner.test.target

它包含您想要执行的真实构建目标,在本例中它是一个简单的文件副本。

代码语言:javascript
复制
    <Target Name="_innerTestTarget">

    <Message Text="This is a inner test text message"/>
    <Copy SourceFiles="x.txt" DestinationFiles="x1.txt"/>
</Target>

这还没有准备好生产,但希望能说明我的观点。

有了这个(稍微复杂的)过程,您就可以更改inner.test.target文件,而不必在VS中重新加载解决方案。

票数 9
EN

Stack Overflow用户

发布于 2014-07-19 14:47:40

这里有一个根本不需要任何MSBuild脚本的解决方案。

我注意到,卸载并重新加载项目不会绕过缓存,但关闭并重新打开解决方案会。此外,如果Visual Studio注意到.sln文件已更改,它将提示您重新加载解决方案。最后,this superuser question讲解了如何在Windows中访问文件。

将这些放在一起,我添加了一个Visual Studio外部工具来访问当前的解决方案文件。下面是操作步骤:

目录选择工具>外部工具...

  • 单击添加按钮添加新工具。

  • 按如下方式设置属性:
  • 标题: Reload
    1. copy Solution
    2. Command: cmd.exe
    3. Arguments:
    4. :$(SolutionDir)
    5. and打开Use Output /c

  1. 单击[确定]关闭[外部工具]窗口

现在,如果您对MSBuild文件进行了更改,只需选择工具>重新加载解决方案,所有构建文件都将重新加载。

我正在使用Windows 7 64位和Visual Studio 2012 Express for Windows Desktop。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4919204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档