-
-
Save maestrow/94d99017380adbcadff29f048f423729 to your computer and use it in GitHub Desktop.
В статье описывается способ автоматизации получения менеджера пакетов. Отмечены действия для использования внешних пакетов в вашем F#-скрипте. Рассматривается опция
storage: none. Для автоматизации используется PowerShell.
Для того, чтобы использовать Paket, предполагается следующая последовательность действий:
- Создать в директории проекта поддиректорию
.paket - Скачать загрузчик
paket.bootstrapper.exeв директорию.paket - Запустить
paket.bootstrapper.exe, загрузчик скачает последнюю версию менеджера пакетовpaket.exe
Это все. Далее возможно выполнение команд менеджера пакетов .paket/paket.exe
Несмотря на то, что получить Paket просто, проделывать эти действия для каждого проекта или скрипта утомительно. И далее я предлагаю это автоматизировать.
Для автоматизации получения Paket напишем PowerShell-функцию, которая будет создавать в папке проекта поддиректорию .paket и закачивать в нее paket.bootstrapper.exe под именем paket.exe (это т.н. режим Magic mode). А также добавим в переменную PATH путь до поддиректории .paket, чтобы обращаться к менеджеру пакетов прямо из директории проекта. Описанные задачи уже реализованы в скрипте paket-env.ps1.
Чтобы воспользоваться скриптом автоматизации:
- Скачайте скрипт paket-env.ps1 и поместите его в директории вашего PowerShell-профиля (имя этой директории можно узнать выполнив
Split-Path $profile). - Отредактируйте скрипт вашего PowerShell-профиля, импортировав в него скрипт автоматизации
paket-env.ps1. Для редактирования скрипта профиля выполнитеise $profile(подробнее про редактирование профиля powershell см. здесь). Добавьте в профиль строчки:
$scriptDir = Split-Path $MyInvocation.MyCommand.Path
import-module "$scriptDir\paket-env.ps1"Сохраните.
Теперь для инициализации менеджера пакетов Paket достаточно будет выполнить команду paket-bootstrap (из оболочки Powershell, в директории вашего проекта). И далее обращение к paket.exe будет доступно прямо из директории проекта:
paket-bootstrap- наша функция.paket init- создает пустой файлpaket.dependencies
С опцией storage: none (указывается в файле paket.dependencies) для сохранения пакетов Paket будет использовать общий кеш и не будет создавать в проекте отдельную папку packages, что позволяет экономить дисковое пространство и оставляет директорию проекта более чистой. Размер папки packages может быть 300Мб-400Мб, а это совсем не нужно для тестовых проектов и папок с F#-скриптами. Особенно это актуально на ноутбуках с небольшими по объему SSD.
Если в paket.dependencies используются группы, то опцию storage: none нужно указывать для каждой группы.
Скрипты на F# - удобный инструмент для экспериментов, для быстрого написания и проверки небольших решений (функций, модулей), из которых в дальнейшем может складываться целый проект.
Для того, чтобы из скрипта сослаться на внешную библиотеку (nuget-библиотеку или модуль с github или модуль, взятый из произвольного URL), воспользутесь инструкцией ниже:
Для добавления пакета используется команда paket add. Например, paket add Fue. Добавленные пакеты будут регистрироваться в файле paket.dependencies.
После того как вы добавите в проект нужные пакеты, необходимо сгенерировать скрипт(ы) для подключения пакетов: paket generate-load-scripts (подробнее здесь). Include-скрипты будут сгенерированы в папке .paket\load. Можно ограничиться скриптами только для определенной платформы, например paket generate-load-scripts --framework netstandard2.0. Также можно добавить опцию generate_load_scripts: true в paket.dependencies и тогда include-скрипты будут генерироваться при установке пакетов, т.е. при выполнении paket install.
После того как пакеты добавлены в проект и сгенерированы include-скрипты, на пакеты можно добавлять ссылки в ваш собственный скрипт, например #load @".paket\load\netstandard2.0\Fue.fsx".
To initialize Paket for your F# project use
Manual way:
- Create
.paketsubdir in your project folder - Download
paket.bootstrapper.exeto.paket - run
.paket/paket.bootstrapper.exe - run
.paket/paket init
OR automated way:
You can include paket-env.ps1 in your profile script and then to bootstrap paket just run: paket-bootstrap; paket init
| # Automate your everyday paket bootstrapping. | |
| # installation: Add this script in your `$profile` script by `import-module "$PSScriptRoot\Paket-Bootstrap.ps1"`. | |
| # usage: enter your project dir and call `Paket-Bootstrap` to download fresh version, and then refer the paket directly, i.e. `paket init` (not ./paket/paket.exe init). | |
| $env:Path += ";./.paket" | |
| function Paket-Bootstrap { | |
| mkdir -Force .paket | |
| $html = Invoke-WebRequest -Uri "https://github.com/fsprojects/Paket/releases/latest" | |
| $href = $html.ParsedHtml.getElementsByTagName("a") | where { $_.href -Like "*paket.bootstrapper.exe" } | select -ExpandProperty href | select -Unique | |
| $url = $href -replace "about:/", "https://github.com/" | |
| (New-Object System.Net.WebClient).DownloadFile($url, "$pwd/.paket/paket.exe") | |
| } |
- Init Paket
paket-bootstrap
paket init
- Add
storage: nonetopaket.dependencies:PS> "storage: none" | Add-Content "paket.dependencies" - Add packages:
paket add <package ID> paket generate-load-scriptsorpaket generate-load-scripts --framework <framework>- Use packages like this:
#load @".paket\load\<framework>\<package ID>.fsx"