Если вы разрабатываете приложения Xamarin.Forms, то, вероятно, знаете, что через некоторое время у вас будет много вещей, которые можно добавить при запуске нового проекта.
Вам нужно добавить свои любимые базовые классы, пользовательские элементы управления, средства визуализации, расширения и т. д. Чтобы добавить все, требуется почти полдня. Позже, когда вы начинаете новый проект, вам нужно будет сделать это еще раз. И еще раз, когда стартует другой проект. И еще раз, когда запустится другой и т. Д. Что, если я скажу вам, что вы можете сэкономить это время и по-прежнему использовать эти функции? Что, если я скажу вам, что создать собственный пакет NuGet очень просто?

Цель этой статьи - создать стандартный пакет Nuget для .NET, чтобы мы могли использовать его в наших проектах.

Для целей этой публикации давайте создадим классы GradientView и BaseViewModel. GradientView будет элементом управления с градиентным фоном, а BaseViewModel будет нашей абстрактной моделью ViewModel, содержащей наши основные свойства, такие как Title, IsBusy и т. д. Рецепт довольно прост.

Как указано в заголовке, мы хотим, чтобы пакет использовал стандарт .NET. Так:

  1. Во-первых, нам нужно создать стандартную библиотеку .NET.
    Ваша стандартная библиотека .NET должна быть нацелена… просто проверьте в этом списке, какая версия наиболее подходит для вас.
    К настоящему времени у вас должен быть только один проект в вашем решении.
  2. Добавить проект библиотеки Android в существующее решение,
  3. Добавить проект библиотеки iOS. То же, что и во 2 пункте.

Вы можете найти проекты библиотеки здесь:

На этом этапе стоит вспомнить, что вы ввели в имя сборки - вы можете запомнить его, как вы будете использовать его при использовании элемента управления в файле Xaml:

Если у вас есть решение с 3 проектами (или более, если хотите), добавьте ссылку на ранее созданный стандартный проект .NET в проектах iOS и Android. Также добавьте пакет Xamarin.Forms в каждый проект.

К настоящему моменту это должно выглядеть так.

Теперь добавьте любые пакеты, которые хотите использовать.

Когда вы закончите, напишите / скопируйте то, что вы хотите добавить в пакет. Я просто добавлю класс BaseViewModel в свой стандартный проект .NET и GradientView с модулями визуализации. В средствах визуализации включите строку
[Preserve (AllMembers = true)] перед объявлением класса.

В проекте iOS сделайте то же самое.

Итак, приступим к самому интересному. Выберите выпуск в меню верхней панели.

Сделав это, соберите каждый проект. Вы можете сделать это, щелкнув по нему правой кнопкой мыши и выбрав build. После этого проверьте, были ли созданы файлы. dll. У вас должен быть их путь, аналогичный: «/bin/release/your_project_name.dll». Они должны быть в каждом вашем проекте. Если они у вас есть, продолжайте. Если нет, исправьте!

К настоящему времени у вас должно быть много dll-файлов. Нам понадобится 5 из них (1 для проекта Core, 2 для iOS, 2 для Android - в папках для конкретной платформы должны быть YourNuget.Core.dll и YourNuget.iOS.dll).

Теперь давайте создадим файл nuspec в корневой папке решения.
Назовите его примерно так: YOUR_SOLUTION_NAME.nuspec
Когда я делал это на Mac, я просто скопировал другой файл nuspec из загруженного проекта, который у меня был мой диск.
Теперь откройте файл nuspect в текстовом редакторе. Появится что-то похожее:

Пойдем по атрибутам.

id - просто идентификатор вашего пакета. Это видно пользователю. Они могут искать ваш пакет по идентификатору. Они могут скачать его по идентификатору.
версия - просто пакетная версия, здесь ничего особенного. Также виден для пользователей.
title - я бы сказал подзаголовок, поскольку он отображается под названием пакета в nuget. Краткое описание пакета
авторов и владельцев - слишком очевидно, чтобы объяснять. Разберитесь сами ;-)
licenseUrl - ссылка на лицензию.
projectUrl - ссылка на GitHub или веб-сайт.
iconUrl - ссылка на миниатюру, которая будет видна при добавлении слепка. Он принимает значок размером 64x64 пикселя.
requireLicenseAcceptance - это логическое значение. Правда или ложь. Иногда, когда вы устанавливаете пакет, он просит вас подтвердить лицензионное соглашение. Просто юридическая информация.
description - описание вашего пакета.
резюме - просто краткое описание вашего приложения.
теги - теги везде ... просто пометьте пакет.
зависимости - какие пакеты необходимы для использования пакета.
releaseNotes - просто releaseNotes.
files - сердце файла nuspect. Найдете ниже.

Файлы

Может быть, нам стоит описать это здесь. Как видите, он состоит из 3 групп: Net Standard, Android и iOS (разделенных комментарием xaml). Вам нужно понимать, что это не означает, что будет создано много пакетов! Вы просто говорите, что хотите включить в пакет.

Каждая строка содержит src и target. Src - это путь к вашему DLL-файлу, который вы хотите включить. Target говорит, что с этой dll следует обращаться как с этим типом. Говоря о проекте Core, вы должны использовать библиотеки DLL как стандарт .NET, PCL-111, PCL-259 и т. Д.

Что интересно, так это сделать пакет для Android / iOS. Думайте об этом как о справочнике. Вы хотите использовать некоторый контроль из Xamarin.iOS. Это прекрасно, но у этого элемента управления есть связываемые свойства! Таким образом, вы ссылаетесь как на средство визуализации, так и на основной проект. То же самое происходит при создании пакета; например. для iOS следует ссылаться на обе библиотеки: iOS и Core.
Вот почему в первой строке вы говорите:

Эй, давайте использовать Core . dll как iOS / Android!

то во второй строке вы говорите

… А также, пожалуйста, включите библиотеки DLL, зависящие от платформы, если я захочу их использовать.

Вы просто указываете на основную и специфичную для платформы dll и говорите nuget включить их.

Основываясь на приведенной выше информации, создайте свой файл NUSPEC.

Предполагая, что вы все сделали правильно, откройте Терминал, перейдите в корневую папку решения и запустите

пакет nuget YOUR_SOLUTION_NAME.nuspec

Если вы все сделали правильно, вы должны увидеть информацию «успешно создан пакет […]» и пакет должен быть создан.

Теперь проверьте, работает ли ваш пакет!

Сделайте это перед публикацией на nuget. По крайней мере, делайте это, когда делаете версию 1.0.0!

Для этого создайте образец проекта, ориентированный на ту же платформу .NET (или выше), что и пакет. Если вы не знаете, как это сделать, следуйте этому руководству. Вероятно, при ретаргетинге эта ошибка появится.

Ошибка. Были включены повторяющиеся элементы EmbeddedResource.

Но эй! Не паникуйте! Откройте основную / корневую папку, откройте. csproj и удалите группу элементов с помощью EmbeddedResource. Как только вы это сделали, запустите и проверьте, работает ли он. Если это так, то отлично, не гуглить, как это исправить.
А пока предположим, что все в порядке. Импортируйте свой nuget.

На Mac для этого:
В выбранном проекте откройте всплывающее окно добавить пакет. В верхнем левом углу есть раскрывающийся список с надписью nuget.org, щелкните его и выберите "Настроить источники". Это должно появиться.

В правом нижнем углу нажмите Добавить. Еще одно всплывающее окно.

  1. Введите имя вашего источника (оно будет отображаться только в вашей Visual Studio, в моем случае это было просто Medium).
  2. Выберите путь или введите URL-адрес того места, где вы хотите хранить все свои nugets.

После того, как вы закончите, нажмите «Добавить источник». Вы должны вернуться к всплывающему окну «Добавить пакет» с измененным источником на ранее созданный.

Теперь выберите свой пакет и добавьте его. Добавьте его во все необходимые проекты. После этого запустите проект и проверьте, работает ли он!

Если получится, опубликуйте!

  1. Перейдите на nuget.com.
  2. Войдите или зарегистрируйтесь.
  3. На верхней панели у вас должна быть кнопка «обновить».
  4. Щелкните по нему.
  5. Бросьте файл.
  6. Проверяйте информацию и публикуйте!

Через некоторое время ваш пакет станет вам виден! В моем случае это было видно через 30 минут.

На этом пока все! Если я что-то пропустил или что-то непонятно, дайте мне знать в комментариях!

Если вам понравился этот пост, не забудьте 👏!