Visual Studio 2017 не загружает задачу AjaxMin MSBuild по указанному пути

Я пытаюсь обновить существующее приложение, чтобы оно загружалось в Visual Studio 2017 (Enterprise - V15.2 (26430.12)) из Visual Studio 2015 (Enterprise), и возникают проблемы с задачей сборки AjaxMin.

В Visual Studio 2015 задача сборки AjaxMin находится в C:\Program Files (x86)\MSBuild\Microsoft\MicrosoftAjax. Visual Studio 2017 ищет его в C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft. Учитывая, что у всех разработчиков в команде может не быть VS2017 Enterprise, и в прошлом у нас были проблемы с разработчиками, устанавливающими неправильную версию, я хотел бы, чтобы она использовала пакет AjaxMin NuGet, указанный в решении.

В решении есть 3 проекта, которые используют задачу AjaxMin. Я обновил все из них, чтобы иметь следующий импорт:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
...
<Import Project="$(MSBuildProjectDirectory)\..\..\..\packages\AjaxMin.5.14.5506.26202\tools\net40\AjaxMin.targets" />
<Target Name="BeforeBuild">
  <ItemGroup>
    <JS Include="..." Exclude="..." />
  </ItemGroup>
  <ItemGroup>
    <CSS Include="..." Exclude="..." />
  </ItemGroup>
  <AjaxMin Switches="..." JsSourceFiles="@(JS)" JsCombinedFileName="..." CssSourceFiles="@(CSS)" CssCombinedFileName="..." />
</Target>
...
</Project>

Однако, когда происходит сборка, я получаю сообщение об ошибке, в котором говорится, что не удается найти задачу AjaxMin в каталоге расширений сборки по умолчанию:

Не удалось загрузить задачу "AjaxMin" из сборки C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll. Не удалось загрузить файл или сборку 'file:///C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll' или одну из ее зависимостей. Система не может найти указанный файл. Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, реализующий Microsoft.Build.Framework.ITask.

Я использовал задачу сообщения MSBuild для вывода пути и проверил его правильность, перейдя к нему из командной строки. Я также попытался использовать UsingTask, но безуспешно.

Почему Visual Studio не ищет библиотеку AjaxMin в указанном мною месте?

Обновление: я переместил тег импорта для AjaxMin вверх (прямо под тегом проекта), и теперь он работает. Я не понимаю почему.

3 ответа

Решение

Проблема оказалась в другом импорте для сторонней задачи сборки. Похоже, что задача сборки изменяет процесс сборки так, что AjaxMin задача сборки не будет работать после нее. Имея AjaxMin построить задачу после Microsoft.CSharp.Targets импорт, но до того, как другая задача сборки третьей стороны сделала свое дело.

Я решил эту проблему, установив.Net 3.5 Framework

Я переместил тег импорта для AjaxMin вверх (прямо под тегом проекта), и теперь он работает. Я не понимаю почему.

Если я правильно понимаю ваш вопрос, это потому, что у вас есть два справочных источника для AjaxMinTask.dllодин является источником сборки по умолчанию:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjaxдругая ссылка на импорт, вы заметите, что AjaxMinTask.dll используется в AjaxMin.targets:

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

<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> 
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" />
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" />
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" />

 ...
</Project>

Поэтому, когда вы задаете ссылку на импорт для вашей задачи, MSBuild будет использовать источник сборки по умолчанию (в каталоге установки VS2017), когда вы устанавливаете ссылку на импорт перед вашей задачей, AjaxMin.targets перепишет путь справочного источника.

Другие вопросы по тегам