Восстановление NuGet завершается неудачно, когда зависимость добавляет импорт .targets в .csproj - PullRequest
6 голосов
/ 15 декабря 2011

Недавно я столкнулся с проблемой восстановления NuGet. Я добавил зависимость проекта (в данном случае PostSharp), а затем включил восстановление. Я проверил в исходном коде, но не в каталоге / packages (так как мне не нужно было .... правильно!). Когда TeamCity или другой разработчик берет исходный код и запускает MsBuild, он получает следующую ошибку:

C:\TeamCity\buildAgent\work\e374975c0264c72e\ProjectName\ProjectName.csproj(70, 3): error MSB4019: The imported project "C:\TeamCity\buildAgent\work\e374975c0264c72e\packages\PostSharp.2.1.5.1\tools\PostSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

Проблема в том, что NuGet еще не запускал восстановление / загрузку PostSharp или его файла .targets. Для меня это похоже на ошибку NuGet, но я хотел посмотреть, есть ли у других такая же проблема.

Кто-нибудь имеет эту проблему или знает решение. Да, я могу зарегистрироваться в каталоге / packages, но тогда зачем вообще использовать NuGet?

Ответы [ 4 ]

3 голосов
/ 26 сентября 2013

Другой подход заключается в изменении рассматриваемого элемента <Import>, чтобы сделать его условным, например:

<Import Project="$(CodeAssassinTargets)" Condition="Exists($(CodeAssassinTargets))" />

Это зависит от нового свойства, определенного в более раннем <PropertyGroup>.Я обычно добавляю один файл вверху файла csproj с другими «глобальными» флагами, например:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <CodeAssassinTargets>$(SolutionDir)packages\CodeAssassin.ConfigTransform.1.1\tools\CodeAssassin.ConfigTransform.targets</CodeAssassinTargets>
        <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>
        <UseMsdeployExe>true</UseMsdeployExe>
    </PropertyGroup>

Затем в соответствующей цели, например BeforeBuild, выдается полезное сообщение об ошибке:

<Target Name="BeforeBuild">
    <Error Text="CodeAssassin.ConfigTransforms target is missing. It needs to exist at $(CodeAssassinTargets) in order to build this project!" Condition="!Exists($(CodeAssassinTargets))" />
</Target>

С этими изменениями проект будет загружаться, даже если восстановление пакета nuget никогда не выполнялось.Если автоматическое восстановление пакетов включено, первая попытка сборки должна устранить проблему с отсутствующей целью, но если это не так, будет выполнено одно ручное восстановление пакета.

1 голос
/ 24 декабря 2011

У меня тоже была такая проблема, но я смог изменить файл .targets в пакете с исходным кодом, чтобы обойти его.По сути, RestorePackages - это цель сборки, которая запускается при сборке проекта.К сожалению, пакет не будет загружен должным образом, пока импорт не будет удовлетворен.Единственный известный мне способ исправить это - включить файл .targets в качестве содержимого, а затем изменить свойство BuildDependsOn, чтобы оно восстанавливало пакеты до запуска пользовательских задач.не помогли с предварительно собранными пакетами, но если вы можете собрать пакет самостоятельно, вы можете это исправить.

1 голос
/ 15 декабря 2011

@ porterhouse91, вы проверили свой файл csproj, чтобы убедиться, что он настроен с соответствующей целью сборки?
Я еще не пробовал новую встроенную функцию восстановления пакета, но я предполагаю, что онаработает, по крайней мере, как предыдущие рабочие процессы на веб-сайтах.В этом случае включение восстановления пакета в вашем решении влияет только на проекты в вашем решении в тот момент, когда вы его включаете.Если вы добавили новый проект (имеющий зависимости NuGet) в решение после включения восстановления пакетов, вам нужно будет включить его снова.Другая возможность: в предыдущих рабочих процессах использовалась папка .nuget, которую нужно было зарегистрировать в VCS, поэтому вам может потребоваться проверить это, если она еще не была включена (если встроенная функция восстановления пакетов действительно используетэтот подход).

Кстати, если этот ответ вообще полезен, спасибо Стивену Ричи - он попросил меня дать ему шанс.

0 голосов
/ 01 июля 2013

Я столкнулся с той же проблемой, когда пакеты Visual Studio 2012 и NuGet не были включены в систему контроля версий.

Ошибка:

The imported project "\packages\Microsoft.Bcl.Build.1.0.7\tools\Microsoft.Bcl.Build.targets" was not found. 
Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

Я обнаружил msdn writeup в ситуации, которая дала следующие обходные пути для захвата проекта из системы контроля версий без пакетов NuGet.

  1. Прекратить использование восстановления пакета и зарегистрировать все файлы пакета
  2. Явно запустить восстановление пакета перед сборкой проекта
  3. Проверить файлы .targets

Я решил использовать вариант №2, однако в настоящее время NuGet (v2.6) не включает в себя способ установки всех пакетов из файла packages.config из Visual Studio.Некоторые поиски показали, что вам нужно использовать командную строку NuGet для выполнения следующей команды перед открытием Visual Studio ( reference ).

c:\path\to\nuget.exe install -o packages project-folder\packages.config
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...