我不知道如何禁用VS缓存,但是我有一个解决方法,可以让您在不重新加载解决方案的情况下编辑构建目标。您可以在proj文件中使用MSBuild任务来调用包装器目标,将CopyDependencies.target文件复制到CopyDependencies.[RandomNumber].target,然后在新创建的文件中调用CopyDependencies目标,最后删除它。这将强制VS在每次调用时重新加载目标,因为文件名不同。以下是一个示例:myProject.proj,请将其添加到AfterBuild目标中:
<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/>
Wrapper.target
这里的“target”是在构建时将复制真实目标文件并在其中调用所需构建目标的目标(我使用了内联c#任务,它只在MSBuild 4.0中可用):
<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">
Random rndGenerator = new Random();
Number = rndGenerator.Next(Int32.MaxValue);
</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
这个参数包含了你想要执行的真正构建目标,在这个例子中它是一个简单的文件复制。
<Target Name="_innerTestTarget">
<Message Text="This is a inner test text message"/>
<Copy SourceFiles="x.txt" DestinationFiles="x1.txt"/>
</Target>
虽然这还不是完全可用的产品,但希望能够说明我的观点。
通过这个(稍微有些复杂的)过程,您可以更改 inner.test.target 文件而无需在 VS 中重新加载解决方案。
Build.????????-????-????-????-????????????.proj
作为今天的代码片段!它和KISS一样有趣 :D - quetzalcoatl