Подтвердить что ты не робот

NuGet и несколько решений

У нас есть два решения: foo.sln и bar.sln

У меня есть общая библиотека, которая используется как foo, так и bar. Common.csproj используется обоими.

Если я открываю ссылки foo и update nuget, все ссылки в Common.csproj указывают на foo/packages/. Если позже я открою бар и обновит ссылки на nuget, все ссылки будут установлены в теги в bar/packages/. Естественно, это отрывается от команды foo, так как это может вызвать несовместимость между Common.csproj и Foo-специфическими файлами, такими как Foo.Data.csproj, который все еще указывает на foo/packages.

Должно быть какое-то очевидное решение, кроме: "создать огромное решение, содержащее все ваши проекты, и если вам нужно коснуться nuget, сделайте это только из этого решения".

Кажется, что проблема на codeplex (кстати, проголосовали за верхнюю часть), но, видимо, я слишком толстый, чтобы понять, как эта проблема решена. Может кто-нибудь объяснить, как это исправить?

4b9b3361

Ответ 1

Эта проблема предшествует NuGet. Если у вас есть проект, упомянутый в двух решениях, и изменить ссылки на сборку в проекте, когда он открыт в одном решении, конечно, он изменит ссылочный путь для этого проекта, когда он будет открыт в другом решении. Это всегда имело место, независимо от того, как ссылка была изменена (с помощью NuGet или иначе).

Но реальная проблема заключается в том, что при обновлении обновленные пакеты не отображаются в каталоге foo/packages?

Простым решением является перемещение Common.csproj в собственное решение с его собственными ссылками, пакетами пакетов, сборкой и выпуском. Затем создайте собственный пакет NuGet с любыми зависимыми зависимостями, встроенными в него. Затем вы можете установить свой общий пакет как в Foo, так и в Bar, а затем команда Foo может обновить до последней версии Common, когда и когда они будут готовы.

Главный аргумент, который я слышал от этого, заключается в том, что вы можете захотеть пройти через общий код во время отладки, но это уже не проблема с Visual Studio 2010.

Основной вопрос, который вам нужно задать, - кто владеет Common.csproj? Это команда Foo или команда Bar?

Ответ 2

Я исправляю проблему, изменяя путь подсказки в файле fil, чтобы содержать переменную $(SolutionDir):

Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <HintPath>$(SolutionDir)packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll</HintPath>

Ответ 3

Почему бы не иметь common.csproj как отдельную сборку, с которой вы ссылаетесь, и имеет свои собственные зависимости, а не те, которые находятся в ее решении.

Поступая таким образом, вы защищаете общее от foo или bar, обновляя указанный пакет и разбивая его.

Ответ 4

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

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

Наше решение состоит в том, чтобы избавиться от относительного пути. Вы можете сделать это, если поместите NuGetPackages на отдельный диск. так:

net use /persistent:yes p: \\localhost\C$\NuGetPackagesDiskFolder

Любое имя папки, в которой вы не найдете После этого вы можете указать реальный абсолютный путь в NuGet.Config

<config>
<add key="repositorypath" value="p:\NuGetPackages" />
</config>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>

После удаления файлов suo

ps: Будет ли небольшая проблема с изменением существующих решений, если они живут в sourcecontrol Самый простой способ - исправить путь к p:\NuGetPackages в каждом .csproj В противном случае необходимо переустановить все ссылки и вручную отменить все packages.config, помеченные как удаленные в sourcecontrol