Имя nuget не распознано как имя командлета
Перейти к содержимому

Имя nuget не распознано как имя командлета

  • автор:

Имя nuget не распознано как имя командлета

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7

Последнее обновление: 14.11.2020

В прошлой теме база данных изначально не существовала и создавалась автоматически в процессе запуска приложения в соответствии с определением классов моделей и класса контекста данных. Но нередко база данных для подключения уже имеется. Рассмотрим, как мы можем подключаться к уже существующей базе данных.

Для подключения к существующей базе данных создадим новый проект. Как и в прошлой теме это будет проект по типу Console App (.NET Core) , который назовем FirstApp.

Подключение к существующей базе данных в EF Core

Для работы с существующей БД MS SQL Server нам надо добавить два пакета:

Реверсинг базы данных в Entity Framework

  • Microsoft.EntityFrameworkCore.SqlServer (представляет функциональность Entity Framework для работы с MS SQL Server)
  • Microsoft.EntityFrameworkCore.Tools (необходим для создания классов по базе данных, то есть reverse engineering)

К примеру возьмем базу данных, созданную в прошлой теме. Эта база данных называется helloappdb.mdf и имеет одну таблицу Users с тремя столбцами Id, Name и Age.

Определение базы данных в Entity Framework

Чтобы подключаться к базе данных, нам надо будет добавить в проект классы моделей, которые соответствуют определениям таблиц, и класс контекста данных, который соответствует БД. То есть в данном случае мы могли бы вручную добавить в проект классы моделей и класс контекста данных, как в прошлой теме.

Однако добавление классов вручную имеет свои недостатки. Так, если база данных имеет не одну, а множество таблиц, связанных различными ключами, то у нас может возникнуть проблема, как все эти отношения отобразить между класса на C#. Ну и кроме того, это просто долго и может занять некоторое время.

Для решения этих проблем в Entity Framework Core предусмотрена функция Reverse Engineering , которая позволяет автоматически создать все необходимые классы по базе данных. Чтобы воспользоваться этой функцией перейдем в Visual Studio к окну Package Manager Console . Его открыть можно, перейдя в меню Tools –> NuGet Package Manager –> Package Manager Console

Далее в Package Manager Console выполним следующую команду:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer

Здесь в качестве параметра команде Scaffold-DbContext передается строка подключения с указанием сервера и названием базы данных.

Reverse Engineering in Entity Framework Core

После выполнения этой команды в проект будет добавлен класс Users:

public partial class User < public int Id < get; set; >public string Name < get; set; >public int Age < get; set; >>

И также будет добавлен класс контекста данных, который будет называться по имени базы данных плюс суффикс «Context»:

using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; #nullable disable namespace FirstApp < public partial class helloappdbContext : DbContext < public helloappdbContext() < >public helloappdbContext(DbContextOptions options) : base(options) < >public virtual DbSet Users < get; set; >protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) < if (!optionsBuilder.IsConfigured) < optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;"); >> protected override void OnModelCreating(ModelBuilder modelBuilder) < OnModelCreatingPartial(modelBuilder); >partial void OnModelCreatingPartial(ModelBuilder modelBuilder); > >

И после генерации данных классов мы сможем работать с базой данных. Для этого изменим код класса Program:

using System; using System.Linq; namespace FirstApp < class Program < static void Main(string[] args) < using (helloappdbContext db = new helloappdbContext()) < // получаем объекты из бд и выводим на консоль var users = db.Users.ToList(); Console.WriteLine("Список объектов:"); foreach (User u in users) < Console.WriteLine($". - "); > > Console.ReadKey(); > > >

Ошибка в консоли диспетчера пакетов(Package Manager Console) Invoke-RestMethod. Ошибка при тестировании контроллера

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Имя nuget не распознано как имя командлета

Совершенно бестолковый, выводит «Привет мир!»
Я хочу из данного скрипта сделать исполняемый файл.
Допустим гугл нам подскажет команду Ps2Exe.

PS C:\Users\Andrew\Documents\PS_test> ps2exe -inputFile C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 -outputFile C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 -iconFile C:\Data\Icon.ico -noConsole -title "MyScript" -version 0.0.0.1 PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes & : Имя "Invoke-ps2exe" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. строка:1 знак:2 + &'Invoke-ps2exe' -inputFile C:\Users\Andrew\Documents\PS_test\helloW . + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Invoke-ps2exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\Users\Andrew\Documents\PS_test> ps2exe PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes Usage: Invoke-ps2exe [-inputFile] '' [[-outputFile] ''] [-prepareDebug] [-x86|-x64] [-lcid ] [-STA|-MTA] [-noConsole] [-UNICODEEncoding] [-credentialGUI] [-iconFile ''] [-title ''] [-description ''] [-company ''] [-product ''] [-copyright ''] [-trademark ''] [-version ''] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-exitOnCancel] [-DPIAware] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths]

Вот то ли лыжи не едут, то ли я понятия не имею, что ей от меня надо.
Причем не важно, короткая форма вызова будет или нет — Имя командлета не распознано.
Но! Если его вызвать просто так (ps2exe?, Invoke-ps2exe) — то командлет находится.

Можно через графику (win-ps2exe), можно другими инструментами (powershell on steroids). Т.е. задача решаема, это не проблема.
Проблема мне понять что здесь идет не так.

——-
— Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Сообщения: 6375
Благодарности: 1425

Конфигурация компьютера
Процессор: Intel Core i5-8259U @ 2.30GHz
Материнская плата: Intel NUC8BEB
Память: Patriot 2400 C15 Series DDR4-2400, 32 GB
HDD: Samsung SSD 970 EVO Plus 500 GB, M.2
Видеокарта: Intel Iris Plus Graphics 655
Звук: Behringer UCA222 + M-Audio Studiophile AV 40
Монитор: BenQ G900 (19″ LCD, 5:4)
ОС: Windows 11 Pro x64

У вас у входного и выходного файла одинаковые имена и расширения, может, дело в этом?

Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Сообщения: 4458
Благодарности: 994

Да, ошибка в написании есть, но нет, ситуацию это не спасает.

PS C:\Users\Andrew\Documents\PS_test> ps2exe -inputFile C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 -outputFile C:\Users\Andrew\Documents\PS_test\111.exe PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes & : Имя "Invoke-ps2exe" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. строка:1 знак:2 + &'Invoke-ps2exe' -inputFile C:\Users\Andrew\Documents\PS_test\helloW . + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Invoke-ps2exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

Есть предположение, что windows не переустанавливался очень давно и система захламлена. (Гипотетически)
Я с какой-нибудь оказией попробую на чистой установке.

——-
— Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Сообщения: 6375
Благодарности: 1425

Конфигурация компьютера
Процессор: Intel Core i5-8259U @ 2.30GHz
Материнская плата: Intel NUC8BEB
Память: Patriot 2400 C15 Series DDR4-2400, 32 GB
HDD: Samsung SSD 970 EVO Plus 500 GB, M.2
Видеокарта: Intel Iris Plus Graphics 655
Звук: Behringer UCA222 + M-Audio Studiophile AV 40
Монитор: BenQ G900 (19″ LCD, 5:4)
ОС: Windows 11 Pro x64

Надо поставить ps2exe как модуль в Powershell, это было сделано?

Сообщения: 4458
Благодарности: 994

PS C:\Users\Andrew\Documents\PS_test> PS C:\Users\Andrew\Documents\PS_test> Install-Module ps2exe PS C:\Users\Andrew\Documents\PS_test> ps2exe -inputFile C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 -outputFile C:\Users\Andrew\Documents\PS_test\111.exe PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes & : Имя "Invoke-ps2exe" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. строка:1 знак:2 + &'Invoke-ps2exe' -inputFile C:\Users\Andrew\Documents\PS_test\helloW . + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Invoke-ps2exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\Users\Andrew\Documents\PS_test> ls Directory: C:\Users\Andrew\Documents\PS_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 21.08.2022 9:44 1558 helloWorld.ps1 -a--- 20.08.2022 19:45 32768 hw.exe -a--- 20.08.2022 19:51 24576 hw_console.exe -a--- 21.08.2022 9:10 281088 tt.exe PS C:\Users\Andrew\Documents\PS_test> $PSVersionTable Name Value ---- ----- PSVersion 7.2.0-preview.10 PSEdition Core GitCommitId 7.2.0-preview.10 OS Microsoft Windows 10.0.17763 Platform Win32NT PSCompatibleVersions PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0

Значит, дело было так.
В PS версии 7 это фигня через установку модуля не отрабатывает. Причем молчит как резанная.
В PS версии 5, открытой от имени администратора после Install-Module потребовался
Import-Module

PS C:\Windows\system32> Install-Module ps2exe Для продолжения требуется поставщик NuGet Для взаимодействия с репозиториями на основе NuGet модулю PowerShellGet требуется версия поставщика NuGet "2.8.5.201" или более новая. Поставщик NuGet должен быть доступен в "C:\Program Files\PackageManagement\ProviderAssemblies" или "C:\Users\Andrew\AppData\Local\PackageManagement\ProviderAssemblies". Поставщик NuGet можно также установить, выполнив команду "Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force". Вы хотите, чтобы модуль PowerShellGet установил и импортировал поставщик NuGet прямо сейчас? [Y] Да - Y [N] Нет - N [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"): y Ненадежный репозиторий Идет установка модулей из ненадежного репозитория. Если вы доверяете этому репозиторию, измените его значение InstallationPolicy, запустив командлет Set-PSRepository. Вы действительно хотите установить модули из "PSGallery"? [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "N"):y PS C:\Users\Andrew\Documents\PS_test> ps2exe ps2exe : Команда "ps2exe" найдена в модуле "ps2exe", но загрузить этот модуль не удалось. Для получения дополнительных сведений выполните команду "Import-Module ps2exe".

Import-Module потребовал включение политики выполнения скриптов Set-ExecutionPolicy

PS C:\Users\Andrew\Documents\PS_test> Set-ExecutionPolicy Командлет Set-ExecutionPolicy в конвейере команд в позиции 1 Укажите значения для следующих параметров: ExecutionPolicy: Unrestricted

И только после этого

PS C:\Users\Andrew\Documents\PS_test> ps2exe PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes PS C:\Users\Andrew\Documents\PS_test> ps2exe .\helloWorld.ps1 PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes Reading input file C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 Compiling file. Output file C:\Users\Andrew\Documents\PS_test\helloWorld.exe written PS C:\Users\Andrew\Documents\PS_test> ls Каталог: C:\Users\Andrew\Documents\PS_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 23.08.2022 10:05 29184 helloWorld.exe -a---- 21.08.2022 9:44 1558 helloWorld.ps1

Так же начало работать и в PS версии 7.

PS C:\Users\Andrew\Documents\PS_test> ps2exe -inputFile C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 -outputFile C:\Users\Andrew\Documents\PS_test\111.exe PS2EXE-GUI v0.5.0.27 by Ingo Karstein, reworked and GUI support by Markus Scholtes PowerShell Desktop environment started. Reading input file C:\Users\Andrew\Documents\PS_test\helloWorld.ps1 Compiling file. Output file C:\Users\Andrew\Documents\PS_test\111.exe written PS C:\Users\Andrew\Documents\PS_test> ls Directory: C:\Users\Andrew\Documents\PS_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 23.08.2022 10:13 29184 111.exe -a--- 23.08.2022 10:05 29184 helloWorld.exe -a--- 21.08.2022 9:44 1558 helloWorld.ps1

——-
— Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Ответственное управление пакетами в Visual Studio

Почти девять лет назад миру был представлен новый опенсорсный проект под названием NuGet (www.NuGet.org). Спустя два года после своего дебюта NuGet начал поставляться в Microsoft Visual Studio, что актуально и по сей день. NuGet — это один из нескольких пакетных менеджеров (диспетчеров пакетов), таких как Node Package Manager (NPM) для JavaScript и Maven для Java. Пакетные менеджеры упрощают и автоматизируют использование библиотек. Например, если вам нужна библиотека для реализации JavaScript Object Notation (JSON) в вашем .NET-приложении, потребуется всего несколько кликов мышью, и ваше приложение получит мощные возможности, которые вам не нужно реализовывать самим, совершенно бесплатно.

Когда-то разработчики создавали и поддерживали свои собственные библиотеки. Если вам нужна была какая-либо библиотека, скорее всего, вы вежливо спрашивали о ней коллег-разработчиков в онлайн-сообществах где-нибудь на CompuServe, что было принято в подобных сообществах, и были все шансы, что вы могли получить библиотеку, отвечающую вашим потребностям или, по крайней мере, рекомендации, как самому ее создать.

Сегодня программное обеспечение с открытым исходным кодом (Open Source Software — OSS) создало беспрецедентную доступность для систем управления кодом и пакетами, которые делают внедрение этого кода в ваши приложения невероятно легким процессом. Однако, этот прогресс принес не только многочисленные преимущества, но и новые риски и проблемы. Одним из недавних примеров является инцидент с event-stream в ноябре 2018 года, связанный с NPM. Эта статья посвящена тому, как ответственно использовать NuGet в Visual Studio, чтобы снизить подобные риски.

Если вы работаете в публичной компании, регулируемой SOX, или подпадаете под действие HIPAA или PCI, и ваши приложения напрямую зависят от какого-либо публичного NuGet-источника, то есть все шансы, что ваша компания может нарушать вышеупомянутые стандарты, несмотря на отсутствие каких-либо неблагоприятных инцидентов.

Ни одно приложение, работающее в продакшене, или процесс сборки никогда не должны напрямую зависеть от каких-либо пакетов из публичных источников.

Если вы не очень хорошо знакомы с NuGet

В случае, если вы не знакомы с NuGet, не знаете что это такое и как он работает в целом, то я рекомендую вам почитать официальную документацию, где вы можете найти всю интересующую вас информацию. А если вы являетесь подписчиком Pluralsight, вы можете посмотреть мой курс “Введение в NuGet”.

Представленные здесь концепции не требуют глубокого понимания NuGet. Целевая аудитория включает в себя как опытных разработчиков, так и директоров с менеджерами, отвечающих за реализацию политик компании в области безопасности и снижения рисков.

Пакетные менеджеры и источники пакетов

Прежде чем углубляться в базовые концепции пакетных менеджеров в .NET/Visual Studio с NuGet, давайте скажем пару слов о пакетных менеджерах и пакетах в целом. Ниже приведены основные понятия, которые вам нужно знать:

  • Пакет: Архивный файл (например, zip или tar), который содержит артефакты кода и дополнительные метаданные для пакетного менеджера, которые, в свою очередь, используются средой разработки для добавления содержимого пакета в проект.
  • Пакетный менеджер: Инструмент, который среда разработки приложений (например, Visual Studio, Eclipse и т. д.) использует для получения доступа к пакетам, содержащимся в источнике пакетов. Распространенными пакетными менеджерами являются NuGet, Maven и Node Package Manager (NPM). Пакетный менеджер берет на себя не только управление доступом к конкретному пакету, он также заботится о доступе к другим пакетам, от которых зависит загруженный пакет (т. е. занимается управлением зависимостями).
  • Источник пакетов: набор пакетов, где для каждого пакета содержатся метаданные о нем. Эти метаданные включают номер текущей версии, историю релизов, ссылки на репозиторий с исходным кодом (например, на GitHub), документацию, информацию о лицензии. Среди самых популярных источников пакетов можно выделить NuGet.org, MyGet и npmjs.com.

Компаниям следует самим создавать собственные пакеты и заниматься управлением ими и их зависимостями, а также стремиться к созданию и использованию своих собственных внутренних источников пакетов.

Отношения между этими тремя элементами довольно просты: среда разработки приложений использует пакетный менеджер для подключения к источнику пакетов и получения от него пакетов, которые будут использованы в проекте разрабатываемого приложения.

Каковы риски?

Из трех элементов, приведенных в списке выше, риск возникает из-за двух: пакетов и источников пакетов. Источники пакетов, такие как npmjs.com и NuGet.org, являются открытыми до такой степени, что любой желающий может создать учетную запись и загрузить туда пакет, который впоследствии будет загружаться другими. Из-за одной только этой причины такие открытые источники пакетов ненадежны по своей сути. Означает ли это, что вам следует избегать открытых источников? Конечно нет. Это означает, что при получении пакетов из таких источников вы должны проявлять должную осмотрительность, проверяя содержимое этих пакетов. Если вы не можете с уверенностью определить происхождение пакета и его содержимое, вы подвергаете свою фирму риску, которого в противном случае можно было бы избежать. Реальным примером такого риска и его последствий стал инцидент с event-stream, обнаруженный в ноябре 2018 года. Этот инцидент был связан с вредоносным кодом в пакете, который собирал данные об учетных записях со счетов, имеющих баланс биткоинов выше определенного уровня. The Register сообщил, что код являлся частью популярной NPM-библиотеки, которая в среднем загружалась до двух миллионов раз в неделю.

Если вы не можете с уверенностью определить происхождение пакета и его содержимое, вы подвергаете свою фирму риску, которого в противном случае можно было бы избежать.

С одной стороны, открытые источники пакетов делают код легко доступным. С другой стороны, эти открытые источники пакетов НЕ ОСУЩЕСТВЛЯЮТ и, возможно, НЕ МОГУТ В ПРИНЦИПЕ контролировать наличие вредоносного кода в пакетах. Так кто должен следить за этим? Ответ очень прост: ВЫ! Если вы привносите пакет в свою организацию, вы обязаны проверить не только содержимое пакета, но и содержимое всех остальных пакетов, от которых зависит загруженный пакет.

Управление зависимостями — еще одна приятная функция, осуществляемая пакетным менеджером. Если вам показалось, что внедрение вредоносного пакета в вашу организацию похоже на распространение заразного вируса, вы все правильно поняли.

Дело в том, что ни одно приложение, работающее в продакшене, или процесс сборки никогда не должны напрямую зависеть от каких-либо пакетов из публичных источников. Помимо злоумышленников, есть много других менее опасных причин не доверять публичным источникам пакетов:

  • Вы оставляете за владельцем пакета все, что касается управления зависимостями и версиями. Что, если владелец пакета введет зависимость, которая необходима для работы пакета, но полностью несовместима с вашим приложением?
  • Что, если владелец пакета загрузит новую версию пакета, которая будет работать, но тем не менее станет причиной бага в вашем приложении? Если вы настроили процесс сборки на автоматическое обновление пакетов, то это может стать причиной дорогостоящей ошибкой, на исправление которой вам придется потратить реальные деньги.

Компаниям следует самим создавать собственные пакеты и заниматься управлением ими и их зависимостями, а также стремиться к созданию и использованию своих собственных внутренних источников пакетов. Если вы используете пакет из публичного источника, вы следует сначала открыть пакет и оценить его содержимое, и только после этого добавлять этот пакет в свой проект или его содержимое в свой собственный пакет.

Разве подписывание пакетов не снижает риск?

Одним словом, да, но это “да” с оговорками. Подписывание снижает некоторые риски, но не все. Подписывание не предотвратило бы инцидент с event-stream. Единственное, что делает подписывание пакета, — это удостоверяет автора/контрибьютора пакета. Безусловно, в большинстве сред вы можете ограничить пакеты, которые вы можете использовать, по определенным авторам. Если у вас есть публичный ключ, то брать можно только те пакеты, которые подписаны авторским сертификатом. Однако это не означает, что вы можете расслабиться и не глядя брать любой пакет от этого автора. Что, если авторский сертификат был скомпрометирован? Что, если автор допустил невинную ошибку, в результате которой ваша компания может понести ущерб?

Теперь, когда у вас есть какое-никакое представление о пакетах, пакетных менеджерах и источниках пакетов, а также о связанных с ними рисках, давайте применим эти знания к NuGet.

Краткий обзор NuGet: создание собственного источника NuGet

Как я уже говорил ранее, эта статья не является подробным практическим руководством по NuGet. Если вас интересует таковое, то вам следует обратиться к материалам, представленным в начале этой статьи. В предыдущем разделе я описывал как взаимосвязаны пакеты, пакетные менеджеры и источники пакетов — NuGet использует тот же подход. Для Visual Studio NuGet является стандартным встроенным пакетным менеджером, и найти его можно как показано на рисунке 1.

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

Рис. 1. Один из способов доступа к пакетному менеджеру NuGet — через контекстное меню проекта или солюшена.

Также на рисунке 1 показан источник пакета. Скорее всего, вашим активным источником пакетов является NuGet.org. В моем случае это нечто с именем Local Package Source. Рисунок 2 иллюстрирует, что это такое:

Рисунок 2: В пакетном менеджере NuGet можно управлять источниками пакетов и их приоритетом.

Как видите, локальный источник NuGet — это просто каталог на моем рабочем компьютере. Это может слегка шокировать, но создать источник NuGet так же просто, как создать каталог! На рисунке 3 показаны пакеты NuGet в этом каталоге:

Рисунок 3: В качестве источника NuGet может служить папка с файлами.

Анатомия пакета NuGet

Пакет NuGet — это просто ZIP-архив с другим расширением (.nupkg). На рисунке 4 показано, как открыть его содержимое.

Рис. 4. Если у вас есть какой-нибудь архиватор, например 7-zip, вы можете просто кликнуть правой кнопкой мыши по пакет NuGet и открыть его как самый обычный архив.

На рисунке 5 показано содержимое пакета. Давайте посмотрим, что находится внутри одного из самых популярных и широко используемых пакетов NuGet: NewtonSoft.Json.

Рис. 5. Пакет NuGet содержит метаданные, информацию о лицензии и библиотеки для каждой поддерживаемой версии .NET.

Глядя на рисунок 5, представляющие особый интерес элементы — это папка lib и файлы подписи, лицензии и nuspec:

  • Папка lib: эта папка содержит одну или несколько вложенных папок, названных в соответствии с соглашением об именовании для каждой поддерживаемой версии .NET. Вы можете узнать больше о поддержке сразу нескольких версий .NET здесь.
  • Файл .signature.p7s: как следует из названия, это файл подписи, подписанный авторским сертификатом. Дополнительную информацию о том, как подписывать пакеты NuGet, можно найти здесь. Вы также можете узнать, как требовать, чтобы были доступны только подписанные пакеты, и ограничить пакеты определенными авторами здесь.
  • License.md: это разметочный файл, содержащий условия лицензии для вашего пакета. Как правило, это лицензия с открытым исходным кодом, такая как MIT, GNU или Apache 2.0.
  • Nuspec: Nuspec является файлом-манифестом. Это XML-файл, который используется для создания пакета NuGet. Про этот файл мы поговорим в следующем разделе.

Создание собственного пакета NuGet

Теперь вы понимаете, что такое пакеты, пакетные менеджеры и источники пакетов, и имеете общее представление о том, как NuGet вписывается в это пространство. Вы также понимаете, как создавать и ссылаться на свой собственный источник пакетов, используя не что иное, как простейшую паку с файлам. Осталось только научиться создавать собственный пакет NuGet. Чтобы проиллюстрировать это, я собираюсь использовать свою библиотеку неизменяемых классов, о которой я уже писал в прошлом.

Существует несколько подходов, которые можно использовать для создания пакетов NuGet. Я собираюсь показать вам метод, который я считаю самым понятным и простым в использовании. Есть также много других вариантов, которые вы можете применить, но я не буду здесь их описывать. Для полного охвата всего, что вы можете делать в рамках создания пакетов, обратитесь к документации на NuGet.org.

Шаг 1: Создайте структуру каталогов пакета (Package Directory Structure) и добавьте свои бинарники

Рисунок 6 иллюстрирует структуру каталогов.

Рис. 6. Структура пакета NuGet содержит папку lib, содержащую вложенную папку для каждой поддерживаемой версии .NET. Единственный другой необходимый файл — это файл nuspec (манифест).

Я добавил icon.png, который будет отображаться в пакетном менеджере, как показано на рисунке 1. Текстовый файл License содержит лицензию MIT. И, наконец, nuspec, показанный на рисунке 7:

Шаг 2: Создайте файл Nuspec

Файл nuspec, показанный на рисунке 7, очень прост.

Рисунок 7: Файл nusepc — это манифест, управляющий процессом создания пакета. Самое главное, файл nuspec содержит зависимости пакета.

Полную справку по nuspec можно найти здесь. Идентификатор (ID), который вы выбираете для своего пакета, должен быть уникальным в контексте источника, в котором он размещен. Соответственно, если вы решите сделать свой пакет NuGet доступным на NuGet.org, то идентификатор должен быть уникальным для этого источника. На рисунке 8 показано, как пакет отображается в пакетном менеджере NuGet:

Рис. 8: информация, содержащаяся в файле nuspec, как мы ее видим в пакетном менеджере NuGet.

Шаг 3: Создайте пакет NuGet

Чтобы создать пакет NuGet из командной строки, вам потребуются инструменты командной строки NuGet. На рисунке 9 показано, где можно скачать NuGet.exe.

Рисунок 9: NuGet.exe обеспечивает доступ к функциям NuGet из командной строки, включая создание пакетов и загрузку/установку пакетов NuGet в ваших проектах через автоматизированный сервер сборки, такой как Jenkins или Team City.

На рисунке 10 показано, как создать пакет NuGet:

Рисунок 10: Команда pack NuGet.exe создает пакет NuGet на основе файла nuspec.

Шаг 4: Опубликуйте свой пакет

В зависимости от типа используемого источника пакетов ваши действия могут немного отличаться. Для источника-каталога процесс заключается в копировании файла в каталог. Если вы хостите свой собственный сервер NuGet, вам придется использовать один из методов, описанных здесь.

Другие варианты хостинга

Вместо самостоятельного хостинга или использования публичного NuGet.org вы можете выбрать стороннюю службу. Для NuGet существуют платные сервисы, такие как myget (myget.org) и Chocolatey (chocolatey.org). Если свой собственный источник так просто создать, то зачем вам может понадобиться платный сервис? Эти платные сервисы имеют собственную инфраструктуру аварийного восстановления (Disaster Recovery). Если вы хостите свой собственный источник, вам необходимо думать о том, как будет выполняться резервное копирование и репликация вашего сервера, а также как вы будете восстанавливаться в случае какого-либо катастрофического события.

Заключение

Опенсорс упростил добавление фич в ваши приложения. Частью этой простоты является скорость. Скорость и простота означают меньше “трения” (friction). Давным-давно, до опенсорса, каким мы его знаем сегодня, до интернета и до управления пакетами, в системе существовало неявное трение, которое давало нам время для оценки и анализа. Разработчики прошлого поколения, на мой взгляд, лучше разбирались в управлении изменениями. Они осознавали дисциплину и строгость, необходимые для снижения риска. При всех преимуществах современных технологий, а также скорости и простоте, которые мы получаем с ними, как никогда важно использовать методы снижения рисков, такие как те, что мы обсуждали в этой статье, потому что, если нам легче делать хорошие вещи, то также и злоумышленникам легче проворачивать их грязные делишки. Надежная защита и снижение рисков не бесплатны. Один из самых коварных негативных побочных эффектов бесплатного опенсорса — это ожидание того, что вещи, которые до сих пор имели цену, больше не имеют никакой цены. Учитывайте это в следующий раз, когда будете вводить пакет в вашу среду. Если ваша организация регулируется SOX, HIPAA, FINRA, PCI и т. д., и вы соответствуете этим требованиям, то вы не допустите такой ситуации.

Сегодня вечером в OTUS состоится открытый урок «Магические слова async / await», на котором разберем механизм, скрытый под ключевыми словами async/await. Также рассмотрим правильное использование этих ключевых слов и некоторые другие аспекты асинхронного программирования на C#. Регистрация по ссылке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *