{"id":17950784,"url":"https://github.com/jonathanpeppers/boots","last_synced_at":"2025-04-09T06:11:53.717Z","repository":{"id":35030596,"uuid":"197312993","full_name":"jonathanpeppers/boots","owner":"jonathanpeppers","description":"boots is a .NET global tool for \"bootstrapping\" vsix \u0026 pkg files. Just \"boots https://url/to/your/package\"!","archived":false,"fork":false,"pushed_at":"2024-09-17T17:20:04.000Z","size":1191,"stargazers_count":86,"open_issues_count":13,"forks_count":9,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-02T02:11:40.913Z","etag":null,"topics":["azure-devops","continuous-integration","csharp","dotnet","hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonathanpeppers.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["jonathanpeppers"]}},"created_at":"2019-07-17T04:08:22.000Z","updated_at":"2024-09-17T17:20:08.000Z","dependencies_parsed_at":"2024-10-29T10:03:45.431Z","dependency_job_id":null,"html_url":"https://github.com/jonathanpeppers/boots","commit_stats":{"total_commits":178,"total_committers":8,"mean_commits":22.25,"dds":0.4213483146067416,"last_synced_commit":"ef4cad177be96b11a0fff2794ff1fb99c1a6a14c"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanpeppers%2Fboots","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanpeppers%2Fboots/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanpeppers%2Fboots/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanpeppers%2Fboots/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonathanpeppers","download_url":"https://codeload.github.com/jonathanpeppers/boots/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247987285,"owners_count":21028895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure-devops","continuous-integration","csharp","dotnet","hacktoberfest"],"created_at":"2024-10-29T09:40:30.249Z","updated_at":"2025-04-09T06:11:53.693Z","avatar_url":"https://github.com/jonathanpeppers.png","language":"C#","funding_links":["https://github.com/sponsors/jonathanpeppers"],"categories":[],"sub_categories":[],"readme":"# boots\n\n![boots](icon.png)\n\n| NuGet |\n| --           |\n| `boots` \u003cbr/\u003e [![NuGet](https://img.shields.io/nuget/dt/boots.svg)](https://www.nuget.org/packages/boots) |\n| `Cake.Boots` \u003cbr/\u003e [![NuGet](https://img.shields.io/nuget/dt/Cake.Boots.svg)](https://www.nuget.org/packages/Cake.Boots) |\n\n| Azure DevOps | App Center | Github Actions | Bitrise |\n| --           | --         | --             | --      |\n| [![Build Status](https://dev.azure.com/jonathanpeppers/boots/_apis/build/status/jonathanpeppers.boots?branchName=main)](https://dev.azure.com/jonathanpeppers/boots/_build/latest?definitionId=1\u0026branchName=main) | [![AppCenter](https://build.appcenter.ms/v0.1/apps/87931b9c-e617-4fb7-bfa9-9bfd74f39abb/branches/main/badge)][appcenter] | [![Github Actions](https://github.com/jonathanpeppers/boots/workflows/GitHub%20Actions/badge.svg)](https://github.com/jonathanpeppers/boots/actions) | [![Bitrise](https://app.bitrise.io/app/bb148b2cc62339da/status.svg?token=TEhuHdoNElmh2w8uQ-mYcQ\u0026branch=main)](https://app.bitrise.io/app/bb148b2cc62339da) |\n\n`boots` is a [.NET global tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools) for \"bootstrapping\" vsix \u0026 pkg files.\n\n`boots` is useful for pinning a version of Mono, Xamarin, etc. when building projects on [Azure DevOps Hosted Agents](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/agents?view=azure-devops). You don't get to _choose_ what versions of things are installed on each agent, so it makes sense to install things yourself for reproducible builds. It also allows you to install preview versions of things (or more recent!) before they come preinstalled on Hosted build agents.\n\n## Use it\n\n```bash\ndotnet tool install --global boots\nboots https://url/to/your/package\n```\n\n`boots` currently supports Windows \u0026 Mac OSX, therefore:\n\n* On Windows - assumes the file is a `.vsix` and installs it into all instances of Visual Studio via `VSIXInstaller.exe`.\n* On Mac OSX - assumes the file is a `.pkg` and installs it\n\n### Builds from Stable \u0026 Preview Visual Studio Channels\n\nBy querying the Visual Studio updater manifests, `boots` 1.0.2 or\nhigher allows you to install the latest versions of Xamarin or Mono\nfrom the stable or preview channels.\n\nSome examples:\n\n```bash\nboots --stable Mono\nboots --preview Xamarin.Android\nboots --preview Xamarin.iOS\nboots --preview Xamarin.Mac\n```\n\nThis would install the latest stable Mono and the latest previews for Xamarin.Android, Xamarin.iOS, and Xamarin.Mac.\n\n### Cake\n\nYou can also use `boots` from a [Cake][cake] script:\n\n```csharp\n#addin nuget:?package=Cake.Boots\u0026version=1.0.3.556\n\nTask(\"Boots\")\n    .Does(async () =\u003e\n    {\n        if (!IsRunningOnWindows ()) {\n            await Boots (Product.XamarinMac, ReleaseChannel.Stable);\n            await Boots (Product.XamariniOS, ReleaseChannel.Preview);\n        }\n        await Boots (Product.XamarinAndroid, ReleaseChannel.Preview);\n    });\n```\n\nIf you omit the second `ReleaseChannel` parameter, it will default to `ReleaseChannel.Stable`.\n\n\u003e NOTE! if you need to install Mono, do this in a separate process from the rest of your Cake build.\n\nFor example:\n\n```csharp\nTask(\"Mono\")\n    .Does(async () =\u003e\n    {\n        await Boots (Product.Mono);\n    });\n```\n\nThen invoke Cake twice:\n\n```bash\ndotnet cake --target=Mono\ndotnet cake --target=Boots\n```\n\n[cake]: https://cakebuild.net/\n\n### Network Resiliency\n\nCI systems are somewhat notorious for random networking failures.\nStarting in boots 1.0.4, you can control some of this behavior:\n\n```\n  --timeout \u003cseconds\u003e               Specifies a timeout for HttpClient. If omitted, uses the .NET default of 100 seconds.\n  --read-write-timeout \u003cseconds\u003e    Specifies a timeout for reading/writing from a HttpClient stream. If omitted, uses a default of 300 seconds.\n  --retries \u003cint\u003e                   Specifies a number of retries for HttpClient failures. If omitted, uses a default of 3 retries.\n```\n\nThis can also be defined in a [Cake][cake] script with the\n`BootsSettings` class:\n\n```csharp\nvar settings = new BootsSettings {\n    Channel = ReleaseChannel.Stable,\n    Product = Product.XamarinAndroid,\n    Timeout = TimeSpan.FromSeconds (100),\n    ReadWriteTimeout = TimeSpan.FromMinutes (5),\n    NetworkRetries = 3,\n};\nawait Boots (settings);\n```\n\n### Use the Azure Pipeline Extension Task\n\nInstall the extension into your DevOps instance and add the task to a build or release, or use it from YAML:\n\n```yaml\nsteps:\n- task: Boots@1\n  displayName: Install Xamarin.Android\n  inputs:\n    uri: https://aka.ms/xamarin-android-commercial-d16-4-windows\n```\n\nYou can install the [Boots Extension from the VS Marketplace](https://marketplace.visualstudio.com/items?itemName=pjcollins.azp-utilities-boots).\n\nSee the [Boots Task Extension Source](https://github.com/pjcollins/azure-web-extensions#use-in-your-yaml-pipeline) for more details.\n\nIf you don't want to use the extension, alternatively you can:\n\n```yaml\nvariables:\n  DOTNET_CLI_TELEMETRY_OPTOUT: true\nsteps:\n- script: |\n    dotnet tool install --global boots\n    boots https://aka.ms/xamarin-android-commercial-d16-4-windows\n```\n\n`DOTNET_CLI_TELEMETRY_OPTOUT` is optional.\n\n`DOTNET_SKIP_FIRST_TIME_EXPERIENCE` is also a good idea if you are running on a .NET Core older than 3.0.\n\n## Finding Builds\n\nFor more information on how to source urls for each platform, see [how to find builds](docs/HowToFindBuilds.md)\n\n## Some Examples\n\nInstall Mono, Xamarin.Android, and Xamarin.iOS on Mac OSX:\n\n```bash\nboots https://download.mono-project.com/archive/6.4.0/macos-10-universal/MonoFramework-MDK-6.4.0.198.macos10.xamarin.universal.pkg\nboots https://aka.ms/xamarin-android-commercial-d16-4-macos\nboots https://download.visualstudio.microsoft.com/download/pr/5a678460-107f-4fcf-8764-80419bc874a0/3f78c6826132f6f8569524690322adba/xamarin.ios-13.8.1.17.pkg\n```\n\nInstall Xamarin.Android on Windows:\n\n```cmd\nboots https://aka.ms/xamarin-android-commercial-d16-4-windows\n```\n\n### System.CommandLine\n\n`boots` now uses `System.CommandLine`, so we get rich help text for free:\n\n```\n\u003e boots --help\nboots:\n  boots 1.0.x File issues at: https://github.com/jonathanpeppers/boots/issues\n\nUsage:\n  boots [options]\n\nOptions:\n  --url \u003curl\u003e                       A URL to a pkg or vsix file to install\n  --stable \u003cproduct\u003e                Install the latest *stable* version of a product from VS manifests. Options include: Xamarin.Android, Xamarin.iOS, Xamarin.Mac, and Mono.\n  --preview \u003cproduct\u003e               Install the latest *preview* version of a product from VS manifests. Options include: Xamarin.Android, Xamarin.iOS, Xamarin.Mac, and Mono.\n  --file-type \u003cmsi|pkg|vsix\u003e        Specifies the type of file to be installed such as vsix, pkg, or msi. Defaults to vsix on Windows and pkg on macOS.\n  --timeout \u003cseconds\u003e               Specifies a timeout for HttpClient. If omitted, uses the .NET default of 100 seconds.\n  --read-write-timeout \u003cseconds\u003e    Specifies a timeout for reading/writing from a HttpClient stream. If omitted, uses a default of 300 seconds.\n  --retries \u003cint\u003e                   Specifies a number of retries for HttpClient failures. If omitted, uses a default of 3 retries.\n  --version                         Show version information\n  -?, -h, --help                    Show help and usage information\n```\n\n### App Center\n\n`samples/HelloForms.sln` is a \"Hello World\" Xamarin.Forms project configured with `boots` installing newer versions than what is available on [App Center][appcenter]:\n\n![AppCenter](docs/AppCenter.png)\n\nSee [`appcenter-pre-build.sh`](samples/HelloForms.Android/appcenter-pre-build.sh) in this repo for an example of setting up `boots`. See the [App Center docs](https://aka.ms/docs/build/custom/scripts) for further detail about custom build scripts.\n\n### GitHub Actions\n\nI was able to get `boots` to work on both Windows \u0026 macOS agents in [Github Actions][actions].\n\nSee [`actions.yml`](.github/workflows/actions.yml) for an example.\n\n### Other CI Systems\n\n`boots` has been tested, and appears to work fine on:\n\n* [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/)\n* [App Center][appcenter]\n* [AppVeyor](https://www.appveyor.com/)\n* [Bitrise](https://www.bitrise.io/)\n* [Github Actions][actions]\n* [Travis CI](https://travis-ci.org/)\n\nAny build environment that can be configured to run .NET Core 2.1, can run `boots`. If you have success on other CI systems, let us know!\n\n[appcenter]: https://appcenter.ms\n[actions]: https://github.com/features/actions\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanpeppers%2Fboots","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanpeppers%2Fboots","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanpeppers%2Fboots/lists"}