diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f33e20..04d540d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -105,3 +105,21 @@ jobs: - name: Install default version uses: ./ - run: uvx ruff --version + test-tool-install: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + [ + ubuntu-latest, + macos-latest, + macos-14, + windows-latest, + oracle-aarch64, + ] + steps: + - uses: actions/checkout@v4 + - name: Install default version + uses: ./ + - run: uv tool install ruff + - run: ruff --version diff --git a/README.md b/README.md index af31171..99994c6 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,13 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs - [Usage](#usage) - [Install the latest version (default)](#install-the-latest-version-default) - [Install a specific version](#install-a-specific-version) + - [Install a version by supplying a semver range](#install-a-version-by-supplying-a-semver-range) - [Validate checksum](#validate-checksum) - [Enable Caching](#enable-caching) - [Cache dependency glob](#cache-dependency-glob) - [Local cache path](#local-cache-path) - [GitHub authentication token](#github-authentication-token) + - [UV_TOOL_BIN_DIR](#uv_tool_bin_dir) - [How it works](#how-it-works) - [FAQ](#faq) @@ -178,6 +180,23 @@ are not sufficient, you can provide a custom GitHub token with the necessary per github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} ``` +### UV_TOOL_BIN_DIR + +On Windows `UV_TOOL_BIN_DIR` is set to the `TMP` dir. +On GitHub hosted runners this is on the much faster `D:` drive. +This path is also automatically added to the PATH. + +On all other platforms the tool binaries get installed to the [default location](https://docs.astral.sh/uv/concepts/tools/#the-bin-directory). + +If you want to change this behaviour (especially on self-hosted runners) you can use the `tool-bin-dir` input: + +```yaml +- name: Install the latest version of uv with a custom tool bin dir + uses: astral-sh/setup-uv@v3 + with: + tool-bin-dir: "/path/to/tool/bin" +``` + ## How it works This action downloads uv from the uv repo's official diff --git a/action.yml b/action.yml index d9d77a2..1dbf8f4 100644 --- a/action.yml +++ b/action.yml @@ -29,6 +29,9 @@ inputs: cache-local-path: description: "Local path to store the cache." default: "" + tool-bin-dir: + description: "Custom path to set UV_TOOL_BIN_DIR to." + required: false outputs: uv-version: description: "The installed uv version. Useful when using latest." diff --git a/dist/save-cache/index.js b/dist/save-cache/index.js index 2cf89c1..6adb8c4 100644 --- a/dist/save-cache/index.js +++ b/dist/save-cache/index.js @@ -83008,7 +83008,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cacheDependencyGlob = exports.githubToken = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; +exports.githubToken = exports.toolBinDir = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; const core = __importStar(__nccwpck_require__(2186)); const path_1 = __importDefault(__nccwpck_require__(1017)); exports.version = core.getInput("version"); @@ -83016,8 +83016,19 @@ exports.checkSum = core.getInput("checksum"); exports.enableCache = core.getInput("enable-cache") === "true"; exports.cacheSuffix = core.getInput("cache-suffix") || ""; exports.cacheLocalPath = getCacheLocalPath(); -exports.githubToken = core.getInput("github-token"); exports.cacheDependencyGlob = core.getInput("cache-dependency-glob"); +exports.toolBinDir = getToolBinDir(); +exports.githubToken = core.getInput("github-token"); +function getToolBinDir() { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { diff --git a/dist/setup/index.js b/dist/setup/index.js index 3b70965..a13cbd0 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -90033,6 +90033,7 @@ function run() { } const setupResult = yield setupUv(platform, arch, inputs_1.version, inputs_1.checkSum, inputs_1.githubToken); addUvToPath(setupResult.uvDir); + addToolBinToPath(); core.setOutput("uv-version", setupResult.version); core.info(`Successfully installed uv version ${setupResult.version}`); addMatchers(); @@ -90076,6 +90077,14 @@ function addUvToPath(cachedPath) { core.addPath(cachedPath); core.info(`Added ${cachedPath} to the path`); } +function addToolBinToPath() { + if (inputs_1.toolBinDir !== undefined) { + core.exportVariable("UV_TOOL_BIN_DIR", inputs_1.toolBinDir); + core.info(`Set UV_TOOL_BIN_DIR to ${inputs_1.toolBinDir}`); + core.addPath(inputs_1.toolBinDir); + core.info(`Added ${inputs_1.toolBinDir} to the path`); + } +} function setCacheDir(cacheLocalPath) { core.exportVariable("UV_CACHE_DIR", cacheLocalPath); core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`); @@ -90135,7 +90144,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cacheDependencyGlob = exports.githubToken = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; +exports.githubToken = exports.toolBinDir = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.version = void 0; const core = __importStar(__nccwpck_require__(2186)); const path_1 = __importDefault(__nccwpck_require__(1017)); exports.version = core.getInput("version"); @@ -90143,8 +90152,19 @@ exports.checkSum = core.getInput("checksum"); exports.enableCache = core.getInput("enable-cache") === "true"; exports.cacheSuffix = core.getInput("cache-suffix") || ""; exports.cacheLocalPath = getCacheLocalPath(); -exports.githubToken = core.getInput("github-token"); exports.cacheDependencyGlob = core.getInput("cache-dependency-glob"); +exports.toolBinDir = getToolBinDir(); +exports.githubToken = core.getInput("github-token"); +function getToolBinDir() { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} function getCacheLocalPath() { const cacheLocalPathInput = core.getInput("cache-local-path"); if (cacheLocalPathInput !== "") { diff --git a/src/setup-uv.ts b/src/setup-uv.ts index 6d9d7e5..9486201 100644 --- a/src/setup-uv.ts +++ b/src/setup-uv.ts @@ -18,6 +18,7 @@ import { checkSum, enableCache, githubToken, + toolBinDir, version, } from "./utils/inputs"; @@ -41,6 +42,7 @@ async function run(): Promise { ); addUvToPath(setupResult.uvDir); + addToolBinToPath(); core.setOutput("uv-version", setupResult.version); core.info(`Successfully installed uv version ${setupResult.version}`); @@ -102,6 +104,15 @@ function addUvToPath(cachedPath: string): void { core.info(`Added ${cachedPath} to the path`); } +function addToolBinToPath(): void { + if (toolBinDir !== undefined) { + core.exportVariable("UV_TOOL_BIN_DIR", toolBinDir); + core.info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`); + core.addPath(toolBinDir); + core.info(`Added ${toolBinDir} to the path`); + } +} + function setCacheDir(cacheLocalPath: string): void { core.exportVariable("UV_CACHE_DIR", cacheLocalPath); core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`); diff --git a/src/utils/inputs.ts b/src/utils/inputs.ts index 66eec47..126d962 100644 --- a/src/utils/inputs.ts +++ b/src/utils/inputs.ts @@ -6,8 +6,20 @@ export const checkSum = core.getInput("checksum"); export const enableCache = core.getInput("enable-cache") === "true"; export const cacheSuffix = core.getInput("cache-suffix") || ""; export const cacheLocalPath = getCacheLocalPath(); -export const githubToken = core.getInput("github-token"); export const cacheDependencyGlob = core.getInput("cache-dependency-glob"); +export const toolBinDir = getToolBinDir(); +export const githubToken = core.getInput("github-token"); + +function getToolBinDir(): string | undefined { + const toolBinDirInput = core.getInput("tool-bin-dir"); + if (toolBinDirInput !== "") { + return toolBinDirInput; + } + if (process.platform === "win32") { + return "D:\\a\\_temp\\uv-tool-bin-dir"; + } + return undefined; +} function getCacheLocalPath(): string { const cacheLocalPathInput = core.getInput("cache-local-path");