2016-03-11 3 views
2

Я пытаюсь использовать Mono.Options под номером .NET Core, ¹ используя его инструменты командной строки.Building Mono.Options в .NET Core CLI (dotnet build)

Первоначально я попытался загрузить его from NuGet используя декларацию зависимости в моем project.json файле, но dotnet restore жалуется, что пакет не совместим с dnxcore50 framework.²

поэтому я решил попробовать строить его из источника. Я заметил в исходном коде Mono.Options, что у него есть опция построения PCL. Решив, что, возможно, PCL был близко достаточно приближения к .NET Ядру, я попытался создать проект DLL, чтобы построить его с этой установкой Enabled:

{ 
    "version": "0.0.0-d95ccb2ca5", 
    "compilationOptions": { 
     "emitEntryPoint": false, 
     "define": [ "PCL" ], 
    }, 

    "dependencies": { 
     "NETStandard.Library": "1.0.0-rc2-23811" 
    }, 

    "compile": [ "*.cs" ], 

    "frameworks": { 
     "dnxcore50": { } 
    } 
} 

Я тогда помещенной копией Options.cs скачанной по ссылке выше в тот же каталог, и сказал dotnet build, который дает эти ошибки:

.../Mono/Options.cs(137,22): error CS0234: The 
type or namespace name 'Serialization' does not exist in the namespace 
'System.Runtime' (are you missing an assembly reference?) 
.../Mono/Options.cs(729,27): error CS0246: The 
type or namespace name 'KeyedCollection<,>' could not be found (are you 
missing a using directive or an assembly reference?) 

... плюс некоторые другие все вытекающие из этих двух ключевых ошибок.

Это, наконец, приносит мне на мои вопросы:

  1. Почему System.Runtime.Serialization не хватает? Согласно the docs, он должен быть частью .NET Core.

  2. позже я добавил явные зависимости для исходных пакетов два пространств имен компилятора жалующихся:

    ... 
    "frameworks": { 
        "dotnet5.4": { 
         "dependencies": { 
          "System.ObjectModel": "4.0.*", 
          "System.Runtime": "4.1.0-rc2-23811" 
         } 
        } 
    } 
    

    dotnet restore затем успешно, и большинство ошибок сборки уходит, но первая ошибка о Serialization продолжает происходить. Является ли .NET Core просто неполным в это время?

  3. Есть ли обходной путь, кроме как только ожидание переноса этого класса?

  4. Я использовал dnxcore50 в исходном файле проекта, потому что именно так он создал dotnet new. Переход к dotnet5.4, как представляется, необходимо в соответствии с the ASP.NET 5 package search engine, но в том, что изменение кошерный с .NET Ядра? ³


Asides

  1. Почему? Потому что это 2016 и .NET все еще не имеет встроенной функции синтаксического анализа командной строки. Grrrr. Возможно, приобретение Microsoft Xamarin приведет к тому, что Mono.Options будет включен в .NET Core. Между тем ...

  2. Mono.Options 4.2.2.1 - выпущено после того, как задан вопрос - решает эту проблему совместимости.

  3. Результаты поиска в пакете ASP.NET 5 подразумевают, что netcore50 также должен работать для моих целей, но затем я получаю жалобы по поводу no run-time assembly compatible with osx.10.10-x64.

    Это происходит на машине OS X 10.10 с установленным Mono 4.2.1. Mono.Optionsделает строить под этим, очевидно. Этот вопрос возник из-за того, что я пытаюсь переключить некоторые из моих более простых существующих проектов на это новое, более легкое время выполнения.

+1

Microsoft теперь предоставляет https://www.nuget.org/packages/Microsoft.Extensions.CommandLineUtils/. Полезный документ находится здесь https://msdn.microsoft.com/en-us/magazine/mt763239.aspx – Smartkid

+0

@Smartkid: Спасибо! Только 11 лет поздно, но, наконец, здесь. :) –

ответ

1

Механизм System.Runtime.Serialization был purposefully removed from .NET Core. (Прокрутите вниз до раздела «Двоичная сериализация».) К счастью, Mono.Options фактически не использует этот интерфейс при его создании в режиме PCL, поэтому исправление прост: переместите строку using System.Runtime.Serialization на несколько строк в позицию #else, чтобы она не видно когда PCL определяется.

Избегайте использования RC2, если это возможно. Он все еще находится в разработке, и я вижу несколько вопросов, открытых на GitHub.

После включения RC1 вы можете использовать http://packagesearch.azurewebsites.net, чтобы найти недостающие пакеты и их версии с RC1.

Было бы лучше построить против определенного .NET Platform Standard вместо одного профиля, такого как 5.4 в RC1 (1.3 в RC2).

Что касается ваших побочных вопросов,

  • Есть уже много библиотек с открытым исходным кодом командной строки синтаксического анализа, поэтому Microsoft не пытается заставить вас использовать один.
  • .NET Core имеет другой дизайн от .NET Framework и Mono. Таким образом, миграционные проблемы стоят, но могут быть легко устранены, когда Microsoft имеет всю цепочку инструментов на месте. Подождите и подождите.
+0

Re package search: Это полезный инструмент; благодаря! Следуя подсказкам, я обновил файл проекта по отредактированному вопросу, но проблема 'Serialization' остается. Предложения? –

+0

Re: анализирующие библиотеки командной строки: я не прошу Microsoft «заставить» меня использовать их.Я просто считаю, что у нас было бы намного меньше изобретенных колес, если бы Microsoft отправила каноническую реализацию; конечно, было бы меньше времени на то, чтобы преследовать пакеты NuGet и иметь дело с обычно более низким качеством документов, отличных от MSDN. Существование ['getopt (3)'] (http://linux.die.net/man/3/getopt) на платформах POSIX поддерживает количество библиотек синтаксического разбора на этих платформах. «Достаточно хорошо и предустановленный» каждый раз бьет сторонних разработчиков. –

+0

Re RC2: Много программного обеспечения, которое я использую для хорошего эффекта, открыли проблемы Github. Если вы знаете конкретную проблему, которая по теме по этому вопросу, укажите на нее. До тех пор я собираюсь поверить, что Microsoft использует «RC» так же, как это делает весь мир программного обеспечения, что означает «кандидат на выпуск», подразумевающий «полнофункциональную, но возможно, глючную», причем RC2 менее глючит, чем RC1. –

1

Вы обновили до последней версии: 4.2.2? Теперь это сборка PCL, которая должна поддерживать все платформы .NET, включая .NETCore4.5.

В дополнение к поддержке большего числа платформ, эта версия допускает преобразование аргументов базового типа. Единственным ограничением является то, что операции TypeDesciptor не поддерживаются, но все операции IConvertable.

Все это было сделано в этом PR: https://github.com/mono/mono/pull/2662

+0

Проблема оказалась в использовании' using System.Runtime.Serialization' в строке 137 'Options.cs' , В режиме PCL 'Options.cs' фактически не использует это пространство имен (см. Ifdef'd-out« Serializable ») ниже, поэтому, если вы переместите это число примерно в 4 строки в блок' # else', 'Options .cs' строит в .NET Core напрямую, (это в отличие от того, чтобы быть * referencable * из проекта .NET Core через NuGet.) Я отправил электронное письмо разработчикам проекта через механизм обратной связи nuget.org. –

+0

Я один из сопровождающих. Я обновлю источник. Спасибо за то, что дали нам знать. Работает ли сборка по ссылке? PRs против mono занимают некоторое время :) – Matthew

+0

Re referencing: Извините, нет. Добавление «Mono.Options»: «4.2.2» 'в раздел' dependencies' 'файла' project.json' файла выходит из строя, если для 'frameworks' установлено значение' dnxcore50', значение по умолчанию, по-видимому, из-за отсутствия явного. NET Core для проекта. Если вы затем измените его на 'netcore45' или' dotnet5.4', он много кричит о каких-либо доступных пакетах для 'osx.10.10-x64', а также о несовместимости с DLL-файлами F #. (Попробуйте 'dotnet new --lang f #', а затем измените 'project.json', как указано.) –

0

Документах не являются технически неправильно. Пространство имен все еще существует в .NET Core 1.0 RC2, но верхний уровень пространства имен теперь почти пуст из-за the removal of binary serialization. Вот почему строка using System.Runtime.Serialization терпит неудачу, даже с явной зависимостью от System.Runtime.

Все типы на странице связанной документации реализованы в подпространстве имен Primitives в .NET Core. Добавление следующей строки в файл project.json будет, следовательно, также позволяет using заявления на успех:

"System.Runtime.Serialization.Primitives": "4.1.0-beta-23516" 
Смежные вопросы