Проблемы с кешем и версиями NuGet
У меня проблемы с пререлизными пакетами NuGet, и мне было интересно, что другие сделали в этой ситуации. Функциональность NuGet кажется совершенно другой и, честно говоря, странной, от ожидаемого поведения в Maven. Для быстрого примера, скажем, у нас есть сборки FooAssembly и BarAssembly, классы которых определены следующим образом:
Foo:
namespace Foo {
class FooClass {
public void TestA(){
}
}
}
Бар:
namespace Bar {
class BarClass {
public static void Main(string[] args){
FooClass foo = new FooClass();
foo.TestA();
}
}
}
Когда я собираю Foo, он работает так, что генерирует Foo-1.0.0-SNAPSHOT.nupkg. NuGet устанавливает это в Bar, когда я добавляю его в качестве зависимости, помещая его как в мой локальный кеш в папке%APPDATA%, так и в папку пакетов в моем исходном дереве. Теперь, если я добавлю метод TestB() в Foo и пересоберу, он также сгенерирует Foo-1.0.0-SNAPSHOT.nupkg. Моя сборка помещает этот новый файл nupkg в мой кеш%APPDATA%, как и ожидалось. Однако, когда я пытаюсь перестроить Bar, NuGet не обнаруживает, что мой nupkg в%APPDATA% изменился, и поэтому не имеет нового доступного метода TestB. Я должен вручную удалить папку src/packages (или, по крайней мере, подкаталог Foo в пакетах), чтобы он мог повторно получить пакет из моего кэша.
В Maven, если бы я перестроил Foo с добавленным методом TestB, он поместил бы Foo-1.0.0-SNAPSHOT в мой кэш.m2, и Bar связался бы с новой версией jar и узнал бы о TestB.
Мой вопрос, во-первых, я что-то упустил с NuGet? Во-вторых, если я не, что люди сделали, чтобы обойти этот недостаток? Добавить шаг предварительной сборки MSBuild, чтобы стереть кэш пакета проекта? Добавить номера сборки в конец SNAPSHOT (например, SNAPSHOT42... кажется, что это будет проблематично с более чем одним разработчиком в проекте)?
Любое понимание приветствуется. Благодарю.
2 ответа
ВНИМАНИЕ: устарело
По состоянию на 2018 год этот ответ устарел - см. Мой другой ответ для получения обновленной информации.
Нет Nuget Эквивалент maven SNAPSHOTs
NuGet на самом деле не поддерживает зависимости SNAPSHOT, как это делает Maven, хотя существует открытая проблема для реализации чего-то подобного и обсуждения такой функциональности.
Предложенная возможность состояла в том, чтобы написать сценарий для:
- Создайте новый пакет Foo с другой версией
- Обновить бар, чтобы ссылаться на последнюю версию Foo
Альтернативный подход
В качестве альтернативы, когда я работаю над своими собственными проектами, я всегда строю и Foo
из источника. Потом один раз Foo
Проект становится достаточно стабильным, поэтому я больше не обновляю его, затем начинаю прекращать ссылаться Foo
через исходный код и вместо этого собрать его и ссылаться как пакет nuget.
Если вы используете PackageReference
элементы внутри нового формата файла csproj, теперь вы можете использовать плавающие версии.
Для сборок из Visual Studio вам необходимо явно перестроить, чтобы получить изменения. Для сборок, отличных от Visual Studio, вам нужно -force
обновления, как отмечено в проблеме, обсуждающей открытые версии и обновления.