在项目文件中,我导入了自己目标文件
<Import Project="Build\CopyDependencies.target" />稍后,我从该目标文件调用target
<CallTarget Targets="CopyDependencies" UseResultsCache="false" />如果我编辑CopyDependencies.target文件,我必须重新加载整个解决方案,然后对CopyDependencies.target所做的更改才会生效。我相信它是Visual Studio中的某种构建定义缓存?如果是,也许可以将其关闭?
发布于 2012-02-07 22:12:04
谢谢@KazR
下面是一个较小的解决方案,您可以将其插入到.csproj文件中
<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>问题已解决
发布于 2011-06-03 01:15:06
我不知道您将如何禁用VS缓存,但是我可能有一个变通方法,允许您编辑构建目标,而不必重新加载解决方案。
您可以在项目文件中使用MSBuild任务来调用将CopyDependencies.target文件复制到CopyDependencies.RandomNumber.target的包装器目标,然后在新创建的文件中调用CopyDependencies目标,最后将其删除。
这将迫使VS在每次调用时重新加载目标,因为文件名不同。
下面是一个例子:
myProject.proj
将此代码添加到AfterBuild目标:
<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/>Wrapper.target
这里我们有一个目标,它将在构建时复制实际的目标文件,并在其中调用所需的构建目标(我使用了一个仅在MSBuild 4.0中可用的内联c#任务):
<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
它包含您想要执行的真实构建目标,在本例中它是一个简单的文件副本。
<Target Name="_innerTestTarget">
<Message Text="This is a inner test text message"/>
<Copy SourceFiles="x.txt" DestinationFiles="x1.txt"/>
</Target>这还没有准备好生产,但希望能说明我的观点。
有了这个(稍微复杂的)过程,您就可以更改inner.test.target文件,而不必在VS中重新加载解决方案。
发布于 2014-07-19 14:47:40
这里有一个根本不需要任何MSBuild脚本的解决方案。
我注意到,卸载并重新加载项目不会绕过缓存,但关闭并重新打开解决方案会。此外,如果Visual Studio注意到.sln文件已更改,它将提示您重新加载解决方案。最后,this superuser question讲解了如何在Windows中访问文件。
将这些放在一起,我添加了一个Visual Studio外部工具来访问当前的解决方案文件。下面是操作步骤:
目录选择工具>外部工具...
现在,如果您对MSBuild文件进行了更改,只需选择工具>重新加载解决方案,所有构建文件都将重新加载。
我正在使用Windows 7 64位和Visual Studio 2012 Express for Windows Desktop。
https://stackoverflow.com/questions/4919204
复制相似问题