2014-09-05 2 views
2

РезюмеNuGet: Не включайте ссылку из пакета

Когда пакет библиотеки, используя NuGet и ссылаться на него в другом проекте ссылающийся проект будет тянуть в файлы вывода дополнительных к директории сборки.

Рабочая Case

 

Project: ReferenceLibrary 
    Output: ReferenceLibrary.dll 

Project: DerivedLibrary 
    Output: DerivedLibrary.dll 
    References: ReferenceLibrary (Copy Local = False) 

Project: ConsoleApplication 
    Output: ConsoleApplication.exe 
    References: DerivedLibrary 

Edit: справочная библиотека не копируется, потому что она не будет решена во время выполнения. В зависимости от цели есть несколько версий. Ссылка на вывод proj. так что я могу сделать код против него.

Если я построю это, то только файл DerivedLibrary.dll будет скопирован в папку сборки ConsoleApplication (т. Е. Bin/Release).

Неработающий Дело ссылка

Project: ConsoleApplication 
    Output: ConsoleApplication.exe 
    Package: DerivedLibrary.nupkg (depends on ReferenceLibrary.nupkg) 

проект добавляется DerivedLibray.dll. Оба DerivedLibrary.dll и ReferenceLibrary.dll копируются из их пакетов.

Я вижу, что он копируется в журнале MSBUILD.

_CopyFilesMarkedCopyLocal: 
    Copying file from "c:\...\ReferenceLibrary.dll" to "bin\Debug\ReferenceLibrary.dll" 

Несмотря на то, что он не упоминается в формате .csproj нигде.

Я не могу сказать, является ли это проблемой NuGet (из-за того, как она распаковывает вещи) или проекта Visual Studio (как он копирует ссылочные сборки и кодирует требования в других сборках).

+2

Если библиотека Derived зависит от библиотеки ссылок, неужели вы действительно удивились, что приложение, использующее Derived-библиотеку, также нуждается в библиотеке Reference? Или я неправильно понял вопрос? – mason

+0

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

+1

Если это указано во время выполнения, ваше приложение будет запускаться только в том случае, если кто-то вручную переведет его в папку «bin» или в GAC? Какой прецедент для этого? – ashes999

ответ

2

Возможное решение, которое я нашел, - использовать цель пост-сборки, чтобы удалить оскорбительные ссылки.

В производной библиотеке добавьте файл DerivedLibrary.targets.

<?xml version="1.0" encoding="utf-8" ?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="RemoveUnwantedReferences" AfterTargets="Build"> 
     <Message Text="Removing unwanted references"/> 
     <Delete Files="$(OutputPath)ReferenceLibrary.dll"/> 
    </Target> 
</Project> 

Тогда в .nuspec включить его

<package> 
    ... 
    <files> 
    <file src="Targets/DerivedLibrary.targets" target="/build/DerivedLibrary.targets" /> 
    </files> 
</package> 

Затем, когда кто-то устанавливает пакет будет добавлен после сборки крюк. Когда они копируют файлы, которые будут скопированы, они будут автоматически удалены.

Смежные вопросы