команда dotnet pack вместе с файлом nuspec, не включая DLL проекта

У меня есть проект .NET Standard 2.0 под названием ProjectName.Logging с файлом ProjectName.Logging.nuspec.

На этот файл есть ссылка в .csproj моего проекта

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
  <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  <NuspecFile>ProjectName.Logging.nuspec</NuspecFile>  
</PropertyGroup>

Вот мой .nuspec

<?xml version="1.0"?>
<package >
    <metadata>
        <id>ProjectName.Logging</id>
        <version>1.2.1</version>
        <authors>Jérôme MEVEL</authors>
        <description>Just a logging component</description>
        <dependencies>
            <dependency id="Dapper" version="1.50.5" />
            <dependency id="Another.Project" version="1.1.1" />
            <dependency id="Microsoft.Extensions.DependencyInjection" version="2.1.1" />
            <dependency id="Microsoft.Extensions.Logging" version="2.1.1" />
            <dependency id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" />
            <dependency id="NLog" version="4.5.8" />
            <dependency id="NLog.Extensions.Logging" version="1.2.1" />
            <dependency id="NLog.Web.AspNetCore" version="4.6.0" />
            <dependency id="System.Data.SqlClient" version="4.5.1" />
        </dependencies>
    </metadata>
    <files>
        <file src="bin\Release\netstandard2.0\ProjectName.Logging.dll" target="lib/netstandard2.0/ESHCloud.Logging.dll" />
        <file src="ProjectName.Logging.targets" target="build/ProjectName.Logging.targets" />
        <file src="NLog/Nlog.config" target="content/Nlog.config" />
    </files>
</package>

Как видите, я вручную включаю ProjectName.Logging.dll файл, и мне даже нужно включить Release, потому что использование переменной MsBuild $(Configuration) не работает в моем .nuspec файле.

Я упаковываю проект, выполнив эту команду в каталоге моего проекта

dotnet pack --output C:/Nuget --force

и если я удалю элемент <files> из своего .nuspec при запуске команды dotnet pack, мой сгенерированный пакет Nuget будет полностью пустым.

С другой стороны, если я запустил команду dotnet pack без файла .nuspec, абсолютно все в моем проекте будет включено в пакет Nuget.

Так в чем же дело с командой dotnet pack? Я не понимаю, что делаю не так.

Как включить DLL моего проекта в пакет Nuget без указания конфигурации (Debug или Release)?

И последнее: Я не хочу использовать команду nuget pack.

Я достаточно наигрался с Nuget на наших серверах VSTS (недавно переименованных в Azure DevOps), и у меня нет полного контроля над этими серверами сборки (у моего менеджера есть, но он, кажется, слишком занят, чтобы заботиться об этом).

Подводя итог, nuget pack - не вариант для меня. Я хочу использовать dotnet pack вместе с файлом .nuspec.

Спасибо


person Jérôme MEVEL    schedule 13.09.2018    source источник


Ответы (1)


Чтобы добавить свою DLL без указания конфигурации, используйте шаблон глобуса:

<file src="runtimes\**" target="runtimes/"/>

Если вы используете nuget.exe, вы можете использовать замещающий токен :

<file src="bin\$configuration$\netstandard2.0\*.dll" target="lib\netstandard2.0\"/>

Если вам действительно нужно использовать файл nuspec, вам лучше использовать nuget.exe. Если вы не хотите использовать nuget.exe, отбросьте nuspec. Я провел ярмарку сумма работы с dotnet и nupkgs за последние несколько недель, а смешивание nuspec с файлами проекта затруднительно.

Вы можете поместить большую часть мета- data прямо в csproj:

<PropertyGroup>
  <PackageId>Subor.nng.NETCore</PackageId>
  <PackageVersion>0.0.2</PackageVersion>
  <Authors>Subor</Authors>
  ...
</PropertyGroup>

Это рекомендуемый подход при использовании dotnet CLI. Аналогично для msbuild с PackageReference формат.

Вот пример проекта, над которым я работал. dotnet pack создает пакет bin/Debug/ и dotnet pack --configuration Release создает этот пакет nuget.org.

Все, что есть в проекте, не должно копироваться в nupkg. В Visual Studio проверьте Свойства файлов и убедитесь, что все не помечено как «Содержимое» и т. Д. Также проверьте файлы проекта, чтобы узнать, не попадают ли файлы добавил, что не должно быть. Ищите (ошибочно) использование <PackagePath> и <IsPackable>.

Не зная подробностей вашего проекта, я упомяну о некоторых из аргументы для dotnet pack.

person Jake    schedule 13.09.2018
comment
Большое спасибо за ваш ответ, но, как я уже сказал в своем вопросе, я не могу использовать nuget pack на нашем сервере VSTS просто из-за эта ошибка. И мне нужно использовать .nuspec файл вместе с .targets файлом, потому что мне нужно извлечь NLog.config файл в выходной каталог. - person Jérôme MEVEL; 14.09.2018
comment
Используйте заменяющий токен $configuration$ или шаблон глобуса, который я добавил в начало своего ответа. - person Jake; 14.09.2018
comment
Привет, @Jake, извини за поздний ответ. К сожалению, заменяющий токен $configuration не работает. Если я использую dotnet pack, это должно дать мне конфигурацию по умолчанию Debug, но это не так. Я получаю это сообщение об ошибке error : Could not find a part of the path 'C:\Git\ProjetName.Logging\bin\netstandard2.0', даже если я явно укажу конфигурацию, оно все равно не работает dotnet pack --configuration Release. Можно ли использовать заменяющие токены только с помощью Nuget? Если да, то это не решает мою проблему - person Jérôme MEVEL; 20.09.2018
comment
Но я на самом деле решил свою проблему на данный момент. Я загрузил Nuget CLI 4.7.1 и включил его в свое решение. Затем в Azure DevOps я добавил задачу командной строки, которая вызывает этот файл nuget.exe для выполнения команды пакета. Больше никакой ошибки ... Но все же, если бы вы могли сказать мне, как заставить замещающий токен работать с интерфейсом командной строки dotnet, мне любопытно, почему это не работает. Большое спасибо - person Jérôme MEVEL; 20.09.2018
comment
Замещающие токены могут работать только с nuget, и в этом случае вы должны использовать шаблон glob. Я повторю предложение использовать nuget или отказаться от nuspec. Это почти наверняка не конец ваших проблем. - person Jake; 20.09.2018
comment
Хорошо, я неправильно вас понял насчет заменяющих токенов. Я думал, что это поддерживается интерфейсом командной строки dotnet. Да, как я сказал в своем предыдущем комментарии, я успешно перешел на Nuget CLI. Единственное, что мешало мне использовать его раньше, - это ошибка в более старой версии интерфейса командной строки. Серверы Azure DevOps не предлагают никаких официальных способов использования последней версии интерфейса командной строки, за исключением некоторых обходных путей, как это сделал я. Я не могу отбросить .nuspec файл просто потому, что мне нужно включить .targets файл, который будет выполнять CopyToOutputDirectory файла NLog.config для ссылающихся проектов. Спасибо за вашу помощь - person Jérôme MEVEL; 20.09.2018
comment
Рад слышать! Я попытался соответствующим образом отредактировать свой ответ. Может быть, мне просто отредактировать его ... Из любопытства, если вам нужно скопировать NLog.config в определенное место, можете ли вы не включать его как <Content>, а затем <CopyToOutputDirectory> вместе с <PackagePath> (вот так). Или вам действительно не разрешено трогать файлы проекта? - person Jake; 20.09.2018
comment
У меня было много проблем с content или contentFiles, на самом деле это еще один из моих вопросов SO: https://stackoverflow.com/questions/51959638/nuget-package-contentfiles-not-copied-to-net-core-project Я был бы очень благодарен, если бы вы смогли решить мой второй Также проблема с Nuget :-) - person Jérôme MEVEL; 20.09.2018
comment
Ах я вижу. Да, у меня было более чем изрядная доля проблем со всем этим. знак равно - person Jake; 20.09.2018