Создание стандартной библиотеки.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).