Создание стандартной библиотеки.net с помощью dotnet с использованием стороннего пакета

Я создаю стандартную библиотеку.net 2.0

Я добавляю ссылку на log4net

Я запускаю следующее:

dotnet publish --output d:\temp\publishout

Мой вопрос: почему я вижу все эти выходные данные в папке публикации?

Я ожидаю, что что-то вроде, например, System.Linq будет частью полной среды.net и среды выполнения.net core 2.0, которая уже будет установлена ​​на компьютере.

    Directory: D:\temp\publishout


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       13/01/2018     20:32                runtimes
-a----       13/01/2018     20:32          56477 ClassLibraryStandard.deps.json
-a----       13/01/2018     20:32           4096 ClassLibraryStandard.dll
-a----       13/01/2018     20:32            244 ClassLibraryStandard.pdb
-a----       08/03/2017     19:26         221184 log4net.dll
-a----       11/06/2016     23:13          21856 System.AppContext.dll
-a----       11/06/2016     23:13          93432 System.Collections.Concurrent.dll
-a----       21/12/2017     17:58         180984 System.Collections.Immutable.dll
-a----       21/12/2017     17:58          88472 System.Collections.NonGeneric.dll
-a----       11/06/2016     23:13          34224 System.Diagnostics.DiagnosticSource.dll
-a----       11/06/2016     23:13          27544 System.Diagnostics.StackTrace.dll
-a----       11/06/2016     23:13          22432 System.IO.FileSystem.Primitives.dll
-a----       11/06/2016     23:14         127304 System.Linq.dll
-a----       11/06/2016     23:14          32504 System.Net.WebHeaderCollection.dll
-a----       21/12/2017     17:58         428784 System.Reflection.Metadata.dll
-a----       21/12/2017     17:58          29608 System.Reflection.TypeExtensions.dll
-a----       11/06/2016     23:14          71392 System.Runtime.Numerics.dll
-a----       21/12/2017     17:58          31168 System.Runtime.Serialization.Formatters.dll
-a----       21/12/2017     17:58          29632 System.Runtime.Serialization.Primitives.dll
-a----       11/06/2016     23:14          57720 System.Security.Claims.dll
-a----       21/12/2017     17:58          23472 System.Security.Cryptography.OpenSsl.dll
-a----       11/06/2016     23:14          45504 System.Security.Cryptography.Primitives.dll
-a----       21/12/2017     17:58          21736 System.Security.Principal.dll
-a----       11/06/2016     23:14         114080 System.Text.RegularExpressions.dll
-a----       11/06/2016     23:15          50016 System.Threading.dll
-a----       21/12/2017     17:58          24328 System.Threading.Tasks.Extensions.dll
-a----       11/06/2016     23:14          22400 System.Threading.Thread.dll
-a----       11/06/2016     23:14          22416 System.Threading.ThreadPool.dll
-a----       11/06/2016     23:15         606432 System.Xml.ReaderWriter.dll
-a----       21/12/2017     17:58         138104 System.Xml.XmlDocument.dll

1 ответ

Решение

Это связано с тем, что до.NET Standard 2.0 некоторые реализации поставлялись как сборки в отдельных пакетах, а выходные данные сборки для.NET Core исключали его, поскольку эти пакеты были частью Microsoft.NETCore.App метапакет.

Для.NET Standard 2.0 многие пакеты больше не используются и NETStandard.Library Версия 2.0.0 включает в себя все справочные сборки, необходимые для компиляции.

Проблема здесь в том, что некоторые пакеты были созданы "для.NET Standard 1.*", но теперь "в.NET Standard 2.0".

Например, в приложения NETStandard 1.6 пришлось добавить System.Data.Common вручную использовать содержащиеся типы. NETStandard.Library версия 2.0.0 уже содержит типы, и этот пакет не нужен.

Когда вы публикуете приложение.NET Core 2.0, логика обрезки обнаруживает этот пакет и удаляет его. Этого не происходит для стандартных проектов.NET, так как здесь не применяется логика обрезки, поэтому в результате публикации вы получаете DLL. Это чтобы увидеть, является ли это отсутствующей оптимизацией или как задумано ( открыл для нее проблему с GitHub).

Однако, как @Lex Li уже упоминал в комментариях, вам вряд ли когда-нибудь понадобится публикация вывода библиотеки.NET Standard. Используйте ссылки на проекты или поделитесь проектом через пакеты NuGet. Выходные данные публикации необходимы только для архитектуры на основе плагинов, для которой в настоящее время обходной путь должен заключаться в том, чтобы плагин нацеливался на ту же платформу, что и приложение (например, создавал библиотеку.NET Core вместо.NET Standard).

Другие вопросы по тегам