Пакет Nuget не найден после восстановления VS 2019 16.5.0 - PullRequest
0 голосов
/ 23 марта 2020

Я боролся с Nuget все утро, пытаясь получить решение, основанное на пользовательском интерфейсе И из командной строки. Вот последняя проблема, с которой я не справился:

  • Я запускаю восстановление nuget в файле решения. Это работает, все ссылочные пакеты восстанавливаются - я вижу файлы в папке / packages в папке решения.
  • Я строю с помощью командной строки devenv - мне нужно, потому что это решение содержит типы проектов, которые msbuild не поддерживает.
  • Первый проект, который ссылается на пакет nuget, не может быть скомпилирован с ...cs(3,7,3,17): error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?)
  • Проект строит (и перестраивает, и перестраивает с очищенной папкой пакета) просто нормально в пользовательском интерфейсе, но сборка командной строки не видит восстановленные пакеты.
  • Сборка, которая терпит неудачу, находится в папке CLEAN на том же компьютере, где я делаю сборку пользовательского интерфейса, так что она получается из управление исходным кодом, восстановление nuget, сборка devenv.

Вещи, которые я пробовал

  • Поиск путей неверных подсказок в файле проекта (см. это в другом вопросе / ответе) , Эти ссылки вообще не отображаются в файле проекта - попытка добавить их приводит к ошибке, говорящей, что ссылка не может быть добавлена, потому что она уже добавлена ​​автоматически системой сборки.
  • Проверка того, что файлы существуют после восстановления.
  • Выполнение тех же шагов из командной строки в той же папке, где создается пользовательский интерфейс. Это отлично работает.

Чего мне не хватает? это не должно быть так сложно ..

ОБНОВЛЕНИЕ: решение состоит из 14 проектов: 9 C# библиотек классов, 2 c# приложений, 1 проект служб отчетов и 2 проекта установщика WiX. Все C# проекты предназначены для Net472, а не для ядра. Ключевая часть структуры решения выглядит следующим образом:

  • Проект A ссылки
    • Newtonsoft. Json через nuget
  • Проект B ссылки
    • Проект A
    • Newtonsoft. Json через nuget
    • Другие пакеты через nuget

Во время сборки, Проект B не может быть скомпилирован из-за отсутствия ссылки на Newtonsoft. Json. Проект A и все другие пакеты nuget поставляются компилятору в качестве ссылок. Опять же, все пакеты nuget фактически восстановлены - проект A находит Newtonsoft. Json, проект B - нет.

В подробном выводе журнала msbuild это единственное упоминание о Newtonsoft. Json в сборка проекта 10 (проект B выше):

10>  Dependency "Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed".
10>      Resolved file path is "...ProjectA\bin\Release\Newtonsoft.Json.dll".
10>      Reference found at search path location "...ProjectA\bin\Release".
10>          For SearchPath "...ProjectA\bin\Release".
10>          Considered "...ProjectA\bin\Release\Newtonsoft.Json.winmd", but it didn't exist.
10>      Required by "...ProjectA\bin\Release\ProjectA.dll".
10>      Required by "C:\...ProjectA2\bin\Release\ProjectA2.dll".
10>      Found related file "...ProjectA\bin\Release\Newtonsoft.Json.xml".
10>      The ImageRuntimeVersion for this reference is "v4.0.30319".

(имена папок и проектов скрыты)

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Пара вещей, происходящих здесь, наконец-то получили решение, которое работает. Почему это встроенное в IDE, можно только догадываться - оно добавляет какой-то дополнительный секретный соус, чтобы заставить все работать (больше, чем просто автоматическое c восстановление nuget).

  • Я пытался изменить все проекты для использования PackageRef вместо пакетов .config. Это приводило к сбою восстановления nuget с неясной ошибкой msbuild, которую я не пытался диагностировать.
  • Я заметил, что на НЕКОТОРЫЕ пакеты nuget ссылались в файлах .csproj с обычными элементами Reference, но некоторые из них не были (в частности, Newtonsoft. Json в «Проекте B» - и некоторые другие, которые я не заметил из-за сбоя B).

Чтобы исправить ситуацию:

  1. Удалите ВСЕ использование элементов PackageRef - верните обратно к package.config во ВСЕХ проектах
  2. Убедитесь, что каждая из предоставленных nuget библиотек DLL указана в файлах .csproj. Вы должны сделать это, отредактировав файл csproj вручную - IDE не позволит вам добавить отсутствующие ссылки.

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

0 голосов
/ 24 марта 2020

Пакет Nuget не найден после восстановления VS 2019 16.5.0

devenv /build В командной строке по умолчанию нет задания восстановления пакетов Nuget. Тем не менее, в VS IDE есть такие опции, что он сначала восстановит пакеты, а затем соберет их. Но они не работают в командной строке. См. эту похожую проблему .

enter image description here

Но вы все еще хотите использовать devenv для создания своего проекта, и, поскольку вы используете каркасный проект с packages.config, я полагаю, вы могли бы используйте nuget.exe. См. это . Вы можете попробовать это:

1) загрузить nuget.exe из эту ссылку и затем настроить его локальный адрес на PATH в environment variable и убедитесь, что вы можете вызвать nuget из CMD.

2) открыть vs командную строку, cd путь к решению и затем набрать сначала:

nuget restore

Затем вы введите вашу командную строку devenv, и я уверен, что она будет выполнена без ошибок.

devenv xxxx.sln /rebuild

Кроме , вы можете добавить собственную цель в любой файл xxx.csproj вашего решения. вот так:

 <Target Name="restoresolution" BeforeTargets="BeforeBuild">
    <PropertyGroup>
      <nugetpath>C:\tools</nugetpath> /////the local path of the nuget.exe
    </PropertyGroup>
    <ItemGroup>
      <slns Include="$(MSBuildProjectDirectory)\..\**\*.sln" />
    </ItemGroup>
    <Exec command="$(nugetpath)\nuget restore %(slns.Identity)" />
  </Target>

Тогда вы можете запустить devenv xxxx.sln /rebuild напрямую.

0 голосов
/ 23 марта 2020

вы уже проверили файлы app.config и packages.config и версию do tnet framework?

...