Dotnet добавить пакет с локальным файлом пакета
Используя инструмент командной строки dotnet
, как я могу добавить ссылку на существующий локальный пакет, который не загружен с помощью nuget? Я попытался добавить локальный пакет в проект bar
с помощью dotnet
.
$ dotnet add package /Users/sakra/foo/bin/Debug/foo.1.0.0.nupkg
Пакет foo.1.0.0.nupkg
создан с помощью dotnet pack
в другом проекте. Однако команда dotnet add package
пытается загрузить файл foo.1.0.0.nupkg
из https://api.nuget.org/, который, конечно, не удался.
Ответы
Ответ 1
Невозможно напрямую установить один пакет .nupkg
. NuGet может устанавливать и восстанавливать только каналы, поэтому вам нужно добавить каталог, в котором пакет находится в качестве фида.
Чтобы сделать это, добавьте файл NuGet.Config
, который добавит местоположение каталога в качестве фида, поэтому вам не нужно добавлять исходный параметр к каждой команде, связанной с puget (esp dotnet restore
):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="local-packages" value="../foo/bin/Debug" />
</packageSources>
</configuration>
В качестве альтернативы в .NET Core 2.0 tools/NuGet 4.3.0 вы также можете добавить источник непосредственно в файл csproj, который должен потреблять NuGet:
<PropertyGroup>
<RestoreSources>$(RestoreSources);../foo/bin/Debug;https://api.nuget.org/v3/index.json</RestoreSources>
</PropertyGroup>
Это позволит всем командам использовать пакет:
-
dotnet add package foo
(необязательно добавьте -v 1.0.0
)
-
dotnet restore
-
dotnet run
Обратите внимание, что во время разработки, если вы изменяете пакет nuget, но не увеличиваете его версию как в проекте, производящем nupkg, так и в проекте, который его потребляет, вам нужно очистить свой локальный кеш пакетов до восстановления
dotnet nuget locals all --clear
dotnet restore
Я создал небольшой проект в https://github.com/dasMulli/LocalNupkgExample
Ответ 2
Укажите папку расположения пакета с помощью параметра -s|--source
. Например:
dotnet add package Microsoft.AspNetCore.Cors -s "d:\Cache\localfeed" -f netcoreapp1.1
![введите описание изображения здесь]()
UPDATE. Благодаря @MartinUllrich answer: вы не можете просто установить файл .nupkg
. Необходимо установить локальный фид и добавить локальный файл .nupkg
в фид, прежде чем вы сможете установить пакет. Подробнее см. В разделе @MartinUllrich .
К сожалению, вы можете столкнуться с этой проблемой блокировки:
Пакет 'NameOfPackage' несовместим со всеми структурами в проекте
В этот момент он открыт, и я смог воспроизвести его в стабильной версии пакета.
Ответ 3
Я много боролся с этим, и это единственный способ заставить его работать:
-
Создайте новый "источник пакета" для использования
-
Установите файл .nupkg в источник пакета, используя nuget add ...
-
Используйте dotnet add package Foo -s ...
для установки пакета.
В частности, вам нужно использовать следующие команды:
nuget add../whatever/lib/MyPackage.1.0.0.nupkg -Source./packages
и
dotnet добавить пакет MyPackage -s./packages
Обратите внимание на специально, пару пунктов:
-
Во-первых, вы не можете просто скопировать .nupkg в папку пакетов, я пробовал много вариантов этого, и все, что я могу сказать, это то, что он не работает для меня, в Windows, Mac или Linux.
-
Вы должны использовать версию nuget, которая не менее 3+, или это не работает. Версия по умолчанию для ядра .net - 2.xx на момент написания. Вам нужно будет вручную обновить nuget.
-
Ваша ссылка в файле .csproj будет выглядеть так:
... PackageReference Include = "SolidMud" Version = "1.0.0"...
Т.е. В частности, обратите внимание, что он не ссылается на ваш источник пакета в информации о зависимостях; просто имя и версия пакета.
В основном это означает, что если вы запустите dotnet restore
, он не будет работать, если пакет не будет кэширован в вашем глобальном кэше нуджетов на этом компьютере; вам нужно запустить dotnet restore -s ./packages
при первом восстановлении.
Как упоминалось в другом ответе, пакеты глобально кэшируются; если вы хотите перейти к новой версии с одинаковым идентификатором версии, вам нужно использовать dotnet nuget locals all --clear
или вручную удалить версию кэшированного пакета.
Вот конкретный, полный пример восстановления .nupkg под названием "SolidMud" в новом приложении .Net Core console:
$ dotnet new console -n TestPkgs
The template "Console Application" was created successfully.
Processing post-creation actions...
Running 'dotnet restore' on TestPkgs/TestPkgs.csproj...
Restore succeeded.
$ cd TestPkgs/
$ mkdir packages
$ nuget add ../core-solidmud/lib/SolidMud.1.0.0.nupkg -Source ./packages
Installing SolidMud 1.0.0.
Successfully added package '../core-solidmud/lib/SolidMud.1.0.0.nupkg' to feed './packages'.
$ dotnet add package SolidMud -s ./packages
Microsoft (R) Build Engine version 15.3.117.23532
Copyright (C) Microsoft Corporation. All rights reserved.
Writing /var/folders/29/0695l4fj26j64kp4p8vwqq5h0000gn/T/tmpkRBaST.tmp
info : Adding PackageReference for package 'SolidMud' into project '/Users/doug/dev/dotnet-packages/TestPkgs/TestPkgs.csproj'.
log : Restoring packages for /Users/doug/dev/dotnet-packages/TestPkgs/TestPkgs.csproj...
info : Package 'SolidMud' is compatible with all the specified frameworks in project '/Users/doug/dev/dotnet-packages/TestPkgs/TestPkgs.csproj'.
info : PackageReference for package 'SolidMud' version '1.0.0' added to file '/Users/doug/dev/dotnet-packages/TestPkgs/TestPkgs.csproj'.