Как отключить кэширование определений сборки в Visual studio - PullRequest
22 голосов
/ 07 февраля 2011

В файле проекта я импортирую свой собственный целевой файл

<Import Project="Build\CopyDependencies.target" />

и позже я вызываю target из этого целевого файла

<CallTarget Targets="CopyDependencies" UseResultsCache="false" />

Если я редактирую файл CopyDependencies.target, мне нужно перезагрузить все решение, и только тогда изменения в CopyDependencies.target вступают в силу. Я считаю, что это какое-то кэширование определений сборки в Visual Studio? Если это так, может быть, его можно отключить?

Ответы [ 5 ]

14 голосов
/ 07 февраля 2012

Спасибо @ 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>

Проблема решена

9 голосов
/ 02 июня 2011

Я не знаю, как можно отключить кэш VS, однако у меня может быть обходной путь, который позволит вам редактировать цель сборки без перезагрузки решения.

Вы можете использовать задачу MSBuild в вашем файле proj для вызова цели-оболочки, которая копирует ваш файл CopyDependencies.target в CopyDependencies. [RandomNumber] .target, затем вызывает вашу цель CopyDependencies во вновь созданном файле и, наконец, удаляет ее.

Это заставит VS перезагружать цель при каждом вызове, так как имя файла отличается.

Вот пример:

myProject.proj

Добавьте это к цели AfterBuild:

<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/>

Wrapper.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">
        <!-- 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.

3 голосов
/ 19 июля 2014

Вот решение, которое вообще не требует никаких сценариев MSBuild.

Я заметил, что выгрузка и перезагрузка проекта обходят не кеш, а закрытие и повторное открытие решения.Кроме того, Visual Studio предложит перезагрузить решение, если оно заметит, что файл .sln изменился.И, наконец, этот вопрос суперпользователя объясняет, как прикасаться к файлу в Windows.

Собрав их вместе, я добавил внешний инструмент Visual Studio для прикосновения к текущему файлу решения.Вот как это делается:

  1. Выберите ИНСТРУМЕНТЫ> Внешние инструменты ...
  2. Нажмите кнопку Добавить, чтобы добавить новый инструмент.
  3. Установите свойства следующим образом:
    • Заголовок: Обновить решение
    • Команда: cmd.exe
    • Аргументы: / c copy "$ (SolutionFileName)" +> nul
    • Исходный каталог: $ (SolutionDir)
    • и включите Использовать окно вывода
  4. Нажмите OK, чтобы закрыть окно внешних инструментов

Теперь, если вы внесли изменения в свойФайлы MSBuild, просто выберите ИНСТРУМЕНТЫ> Обновить решение, и все ваши файлы сборки будут перезагружены.

Я использую 64-разрядную версию Windows 7 и Visual Studio 2012 Express для рабочего стола Windows.

3 голосов
/ 28 января 2013

У меня есть другое решение, не включая временные файлы:

Файл Include.targets:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   <Target Name="Foobar">
      <Copy SourceFiles="test.source" DestinationFiles="testFoobar.dest" />
   </Target>

</Project>

Файл проекта:

....
<Target Name="BeforeBuild">
    <Exec Command="$(MSBuildToolsPath)\MSBuild.exe Include.targets /t:Foobar" ContinueOnError="false" />
</Target>
....

в данном случае VSне распознает команду MSBuild и не кэширует файл.

счастливое кодирование!

0 голосов
/ 04 декабря 2014

Перед запуском MSBuild Я запускаю это, чтобы очистить кеш загрузки:

call "%VS120COMNTOOLS%vsvars32.bat"
echo Clear download cache
gacutil -cdl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...