Visual Studio не может обрабатывать вложенный подмодуль, как ожидалось

#git #visual-studio #.net-core #git-submodules

#git #visual-studio #.net-core #git-подмодули

Вопрос:

У меня есть 3 решения, которые

Решения

Решение A

  • Project A1 это проект расширения для классов System.Data.SqlClient (.NET Standard 2.0)

Решение B

  • Project B1 это библиотека, используемая для управления некоторыми экземплярами (.NET Standard 1.0)
  • Project B2 это библиотека, используемая для управления экземплярами с помощью расширенного System.Data.SqlClient через Project A1 (.NET Standard 2.0)

Решение C

  • Project C1 зависит ли библиотека от A1 и B1 (.NET Standard 2.0)
  • Project C2 является ли тест NUnit зависит от всего проекта выше (.NET Core 2.2)

Структура файла

Решения / проекты импортируются через подмодули Git, где структура, как показано ниже:

 - 
--- Solution C
------ Project C1
------ submodules
--------- Solution A
------------ Project A1
--------- Solution B
------------ Project B1
------------ Project B2
------------ submodules
--------------- Solution A
------------------ Project A1
  

Проблема

Хотя я использую Visual Studio для открытия Solution C и компиляции проектов внутри, результаты разные: (примечание: я не включил Solution CsubmodulesSolution BsubmodulesSolution AProject A1 в решение, поскольку VS не разрешает 2 проекта с одинаковым именем)

  • Проект A1: ок
  • Проект B1: ок
  • Проект B2: не в порядке
  • Проект C1: ок
  • Проект C2: не в порядке

VS всегда говорил Project B2 , что не может найти Project A1 (какой путь Solution CsubmodulesSolution BsubmodulesSolution AProject A1 ), если я не щелкну правой кнопкой мыши Project A1 и не выберу очистить, затем перестроить Project B2 (очистка обязательна), ниже приведено сообщение:

Error NU1105 Unable to find project information for 'Solution CsubmodulesSolution BsubmodulesSolution AProject A.csproj'. Inside Visual Studio, this may be because the project is unloaded or not part of current solution. Otherwise the project file may be invalid or missing targets required for restore.

Однако я попытался клонировать только Solution B в новую позицию (с подмодулями Solution A ), и ее можно скомпилировать и запустить, как ожидалось.

Догадки

  • Как предположил @jessehouwing , это может быть проблема не с Git, а с Visual Studio, я думаю, это связано с тем, что VS компилирует проекты с версией 2 Project A1 , в то время как я уже потратил часы на проверку Solution B и Solution C загрузку Solution A из той же ветки и версии.

Обновить

Идентификаторы Guid

  • Project A из Solution A : FD9834ED-3C94-4445-AE15-DFF0F5C42656
  • Project A из Solution A Solution B папки подмодулей with: FD9834ED-3C94-4445-AE15-DFF0F5C42656
  • Project A из Solution A : E0FEC3C6-42AB-47D9-912A-40B3C5D2BA66
  • Project A из Solution C : 2A7E2981-87F6-40A5-86F4-D523EC1F68DB

Любая помощь будет оценена

Комментарии:

1. Это помогло бы узнать версию VS, которую вы используете. Кроме того, такого рода вопросы (особенно по программному обеспечению с закрытым исходным кодом) обычно лучше оставить поставщику, т.е. developercommunity.visualstudio.com См . также learn.microsoft.com/en-us/visualstudio/ide /…

2. Это VS2017 Professional, спасибо

3. Ссылки не на решения, а на проекты. В решении B или C вы используете ссылки на проекты или двоичные ссылки. При использовании ссылок на проекты все косвенные ссылки являются частью решения B или C?

4. Извините, мое плохое, да, решение A, B, C должно быть проектом A, B, C. Я использую ссылку на проект для файлов .csprj. Для компиляции проекта A не требуется ничего, кроме .NET Standard 1.0, в то время как для компиляции проекта B требуется проект A и пакет NuGet System.Data.SqlClient для .NET Standard 2.0. Проект C зависит от проектов A и B и System.Data.SqlClient (уже установленного) для .NET Standard 2.0.

5. Ах, теперь я вижу проблему. В вашем дереве решений одно и ТО ЖЕ решение проект включается несколько раз. Это не работает! Этого никогда не будет. Рекомендуется создать единый родительский репозиторий Git верхнего уровня, смонтировать в него каждый проект подмодуля, хранить один файл решения только в корневом репозитории Git. При необходимости создайте несколько таких корневых проектов.

Ответ №1:

После нескольких часов исследований подтверждается механическая проблема .NET, из-за которой один и тот же проект сохраняется в другом месте и на него ссылаются несколько других проектов. Который .СЕТЬ не может распознать, что это один и тот же проект, даже если все они клонированы с сервера git и имеют одно и то же имя.

Как jessehouwing и было предложено (спасибо за всю вашу помощь, джессехоуинг !!) мы могли бы объединить все проекты (подмодули) в одно гигантское решение для разработки (я думаю, этот подход идеально соответствует названию solution)

Однако то, что мы пытаемся сделать, это использовать нижеприведенную архитектуру:

  • Ядра.Библиотека
  • Компания.Ядра.Библиотека
  • Компания.Core.Web
  • BCompany.Ядра.Библиотека1
  • BCompany.Ядра.Библиотека 2
  • BCompany.Ядра.Консоль
  • BCompany.Core.Web

Итак, наконец, я решил перейти на внутренний канал NuGet, в то время как VS2017 уже может автоматически генерировать файл nupkg при сборке, который был протестирован и работает отлично, как и ожидалось.

@jessehouwing вы можете ответить на вопрос, и я бы поставил ваш в качестве ответа, еще раз спасибо!

Комментарии:

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