mirror of
https://github.com/microsoft/setup-msbuild.git
synced 2026-10-05 16:44:15 +07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d97ad85a9 |
No files matched your search
@@ -1,11 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
groups:
|
|
||||||
github-actions:
|
|
||||||
patterns: ["*"]
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
cooldown:
|
|
||||||
default-days: 7
|
|
||||||
+24
-60
@@ -4,76 +4,40 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- dev
|
- dev
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- "*.md"
|
- '*.md'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- dev
|
- dev
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- "*.md"
|
- '*.md'
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
runs-on: windows-latest
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner:
|
|
||||||
- windows-latest
|
|
||||||
- windows-2025-vs2026
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Setup MSBuild (vswhere-path)
|
- name: Setup MSBuild (vswhere-path)
|
||||||
id: setup_msbuild_explicit
|
id: setup_msbuild_explicit
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
vswhere-path: C:\ProgramData\chocolatey\bin
|
vswhere-path: C:\ProgramData\chocolatey\bin
|
||||||
|
|
||||||
- name: Setup MSBuild (PATH)
|
- name: Setup MSBuild (PATH)
|
||||||
id: setup_msbuild_path
|
id: setup_msbuild_path
|
||||||
uses: ./
|
uses: ./
|
||||||
|
|
||||||
- name: Setup MSBuild (fallback)
|
- name: Setup MSBuild (fallback)
|
||||||
id: setup_msbuild_fallback
|
id: setup_msbuild_fallback
|
||||||
uses: ./
|
uses: ./
|
||||||
env:
|
env:
|
||||||
PATH: ""
|
PATH: ''
|
||||||
|
|
||||||
- name: Setup MSBuild (x64)
|
- name: echo msbuild path
|
||||||
if: runner.arch == 'X64'
|
run: |
|
||||||
id: setup_msbuild_path_x64
|
echo "vswhere-path: ${{ steps.setup_msbuild_explicit.outputs.msbuildPath }}"
|
||||||
uses: ./
|
echo "PATH: ${{ steps.setup_msbuild_path.outputs.msbuildPath }}"
|
||||||
with:
|
echo "Fallback: ${{ steps.setup_msbuild_fallback.outputs.msbuildPath }}"
|
||||||
vs-prerelease: true
|
|
||||||
msbuild-architecture: "x64"
|
|
||||||
|
|
||||||
- name: Setup MSBuild (arm64)
|
- name: echo MSBuild
|
||||||
if: runner.arch == 'ARM64'
|
run: msbuild -version
|
||||||
id: setup_msbuild_path_arm64
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
vs-prerelease: true
|
|
||||||
msbuild-architecture: "arm64"
|
|
||||||
|
|
||||||
- name: Write MSBuild summary
|
|
||||||
if: always()
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
@"
|
|
||||||
## MSBuild setup summary
|
|
||||||
|
|
||||||
- Runner label: `${{ matrix.runner }}`
|
|
||||||
- Runner architecture: `${{ runner.arch }}`
|
|
||||||
|
|
||||||
| Probe | msbuildPath |
|
|
||||||
| --- | --- |
|
|
||||||
| vswhere-path | ${{ steps.setup_msbuild_explicit.outputs.msbuildPath || 'N/A' }} |
|
|
||||||
| PATH | ${{ steps.setup_msbuild_path.outputs.msbuildPath || 'N/A' }} |
|
|
||||||
| Fallback | ${{ steps.setup_msbuild_fallback.outputs.msbuildPath || 'N/A' }} |
|
|
||||||
| x64 | ${{ steps.setup_msbuild_path_x64.outputs.msbuildPath || 'N/A' }} |
|
|
||||||
| arm64 | ${{ steps.setup_msbuild_path_arm64.outputs.msbuildPath || 'N/A' }} |
|
|
||||||
"@ | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append
|
|
||||||
|
|
||||||
- name: echo MSBuild
|
|
||||||
run: msbuild -version
|
|
||||||
@@ -1,98 +1,41 @@
|
|||||||
# microsoft/setup-msbuild
|
# microsoft/setup-msbuild
|
||||||
|
You know how handy that 'Visual Studio Developer Command Prompt' is on your local machine? And how it adds several things to `PATH` to allow you to just issue commands like `msbuild` or otherwise? Use this action to setup similar flexibility in your Windows-based GitHub Actions runners. This will let you discover where the `MSBuild` tool is and automatically add it to the `PATH` environment variables for you so future steps in your Actions workflow can just initiate `msbuild` commands without knowing the full path.
|
||||||
|
|
||||||
This action will help discover where the `MSBuild` tool is and automatically add it to the `PATH` environment variables for you so future steps in your Actions workflow can just initiate `msbuild` commands without knowing the full path.
|
> Please note this tools is not to replicate the full 'Developer Command Prompt' but only discover and assist with MSBuild and not other tools like cl.exe
|
||||||
|
|
||||||
> [!IMPORTANT]
|
## Usage
|
||||||
> Please note this tool does NOT add other Visual Studio tools (like VSTest, cl, cmake, or others) to `PATH`
|
|
||||||
|
|
||||||
## Breaking Changes in v4
|
|
||||||
|
|
||||||
Starting with `v4`, the default value of `msbuild-architecture` is no longer always `x86`. When
|
|
||||||
`msbuild-architecture` is not explicitly specified, the action now **auto-detects** the best
|
|
||||||
architecture:
|
|
||||||
|
|
||||||
- `x64` when running on a 64-bit machine **and** the resolved Visual Studio/MSBuild install is
|
|
||||||
version 17.0 or later (Visual Studio 2022+, which ships a native 64-bit MSBuild).
|
|
||||||
- `x86` otherwise (older Visual Studio versions, or 32-bit hosts), matching the previous behavior.
|
|
||||||
|
|
||||||
If you explicitly set `msbuild-architecture` (e.g. `x86`, `x64`, or `arm64`), that value is always
|
|
||||||
respected and this auto-detection does not apply. If your workflow depends on always getting the
|
|
||||||
32-bit MSBuild by default, set `msbuild-architecture: x86` explicitly.
|
|
||||||
|
|
||||||
## Example Usage
|
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v4
|
uses: microsoft/setup-msbuild@v1.0.3
|
||||||
|
|
||||||
- name: Build app for release
|
|
||||||
run: msbuild src\YourProjectFile.csproj -t:rebuild -verbosity:diag -property:Configuration=Release
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Runners and included software
|
## Specifying specific versions of Visual Studio
|
||||||
|
|
||||||
This action is intended to be used within the GitHub Actions workflows using the model of 'runners' either hosted (provided by GitHub) or self-hosted (provided by you). The version and parameters you specify below are going to be scoped to what software actually exists on the runner image being used. For example, hosted runner images from GitHub typically do NOT have pre-release versions of Visual Studio on them so using `vs-prerelease` parameter noted below may not have intended effect when using hosted runners. The software included for GitHub-hosted runner images can always be found here: <https://github.com/actions/runner-images> which also includes information on when/how software on hosted images gets updated.
|
|
||||||
|
|
||||||
## Optional Parameters
|
|
||||||
|
|
||||||
There are a few additional parameters that can be set if you need them. These are optional and should only be set if you know that you need them or what you are doing.
|
|
||||||
|
|
||||||
### Specifying specific versions of Visual Studio (optional)
|
|
||||||
|
|
||||||
You may have a situation where your Actions runner has multiple versions of Visual Studio and you need to find a specific version of the tool. Simply add the `vs-version` input to specify the range of versions to find. If looking for a specific version, specify the minimum and maximum versions as shown in the example below, which will look for just 16.4.
|
You may have a situation where your Actions runner has multiple versions of Visual Studio and you need to find a specific version of the tool. Simply add the `vs-version` input to specify the range of versions to find. If looking for a specific version, specify the minimum and maximum versions as shown in the example below, which will look for just 16.4.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v4
|
uses: microsoft/setup-msbuild@v1.0.3
|
||||||
with:
|
with:
|
||||||
vs-version: '[16.4,16.5)'
|
vs-version: '[16.4,16.5)'
|
||||||
```
|
```
|
||||||
|
|
||||||
The syntax is the same used for Visual Studio extensions, where square brackets like "[" mean inclusive, and parenthesis like "(" mean exclusive. A comma is always required, but eliding the minimum version looks for all older versions and eliding the maximum version looks for all newer versions. See the [vswhere wiki](https://github.com/microsoft/vswhere/wiki) for more details.
|
The syntax is the same used for Visual Studio extensions, where square brackets like "[" mean inclusive, and parenthesis like "(" mean exclusive. A comma is always required, but eliding the minimum version looks for all older versions and eliding the maximum version looks for all newer versions. See the [vswhere wiki](https://github.com/microsoft/vswhere/wiki) for more details.
|
||||||
|
|
||||||
### Use pre-release versions of Visual Studio (optional)
|
|
||||||
|
|
||||||
If you need your Actions runner to target a pre-release version of Visual Studio, simply add the `vs-prerelease` input. This is necessary if you want to run an action on a virtual environment that contains a pre-release version of Visual Studio or self-hosted images that you may have that also have pre-release versions of Visual Studio installed.
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Add msbuild to PATH
|
|
||||||
uses: microsoft/setup-msbuild@v4
|
|
||||||
with:
|
|
||||||
vs-prerelease: true
|
|
||||||
```
|
|
||||||
|
|
||||||
### Specifying MSBuild architecture (optional)
|
|
||||||
|
|
||||||
By default (as of `v4`), the action auto-detects the preferred MSBuild architecture: it uses `x64`
|
|
||||||
when running on a 64-bit machine with Visual Studio/MSBuild 17.0 or later installed, and falls back
|
|
||||||
to `x86` otherwise. You can override this by explicitly setting the `msbuild-architecture` input.
|
|
||||||
Valid input values are `x86`, `x64`, and `arm64`. Note that the success of these will rely on the
|
|
||||||
runner OS.
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Add msbuild to PATH
|
|
||||||
uses: microsoft/setup-msbuild@v4
|
|
||||||
with:
|
|
||||||
msbuild-architecture: x64
|
|
||||||
```
|
|
||||||
|
|
||||||
## How does this work?
|
## How does this work?
|
||||||
|
|
||||||
This makes use of the vswhere tool which is a tool delivered by Microsoft to help in identifying Visual Studio installs and various components. This tool is installed on the hosted Windows runners for GitHub Actions. If you are using a self-hosted runner, you either need to make sure vswhere.exe is in your agent's PATH or specify a full path to the location using:
|
This makes use of the vswhere tool which is a tool delivered by Microsoft to help in identifying Visual Studio installs and various components. This tool is installed on the hosted Windows runners for GitHub Actions. If you are using a self-hosted runner, you either need to make sure vswhere.exe is in your agent's PATH or specify a full path to the location using:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v4
|
uses: microsoft/setup-msbuild@v1.0.3
|
||||||
with:
|
with:
|
||||||
vswhere-path: 'C:\path\to\your\tools\'
|
vswhere-path: 'C:\path\to\your\tools\'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Notes on arguments
|
## Notes on arguments
|
||||||
|
While the Action enables you to specify a `vswhere` path as well as a `vs-version`, these are more advanced options and when using GitHub-hosted runners you should not need these and is recommended you don't specify them. Using these require you to fully understand the runner environment, updates to the tools on the runner, and can cause failures if you are out of sync. For GitHub-hosted runners, omitting these arguments is the preferred usage.
|
||||||
While the Action enables you to specify a `vswhere` path as well as a `vs-version`, these are more advanced options and when using GitHub-hosted runners you should not need these and is recommended you don't specify them as they are optional. Using these require you to fully understand the runner environment, updates to the tools on the runner, and can cause failures if you are out of sync. For GitHub-hosted runners, omitting these arguments is the preferred usage.
|
|
||||||
|
|
||||||
## Building this repo
|
## Building this repo
|
||||||
|
|
||||||
As with most GitHub Actions, this requires NodeJS development tools. After installing NodeJS, you can build this by executing:
|
As with most GitHub Actions, this requires NodeJS development tools. After installing NodeJS, you can build this by executing:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -104,14 +47,13 @@ npm run pack
|
|||||||
which will modify/create the /dist folder with the final index.js output
|
which will modify/create the /dist folder with the final index.js output
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
|
|
||||||
Thank you to [Warren Buckley](https://github.com/warrenbuckley) for being a core contributor to this Action for the benefit of all developers!
|
Thank you to [Warren Buckley](https://github.com/warrenbuckley) for being a core contributor to this Action for the benefit of all developers!
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
This project welcomes contributions and suggestions. Most contributions require you to agree to a
|
This project welcomes contributions and suggestions. Most contributions require you to agree to a
|
||||||
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
|
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
|
||||||
the rights to use your contribution. For details, visit <https://cla.opensource.microsoft.com>.
|
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
|
||||||
|
|
||||||
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
|
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
|
||||||
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
|
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
import {
|
|
||||||
MIN_VS_VERSION_FOR_X64,
|
|
||||||
parseMajorVersion,
|
|
||||||
resolveMSBuildArchitecture
|
|
||||||
} from '../src/main'
|
|
||||||
|
|
||||||
describe('parseMajorVersion', () => {
|
|
||||||
it('parses a standard installationVersion string', () => {
|
|
||||||
expect(parseMajorVersion('17.9.34728.123')).toBe(17)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('parses a single-segment version', () => {
|
|
||||||
expect(parseMajorVersion('16')).toBe(16)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('trims whitespace before parsing', () => {
|
|
||||||
expect(parseMajorVersion(' 17.0.0.0 ')).toBe(17)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('returns undefined for an empty string', () => {
|
|
||||||
expect(parseMajorVersion('')).toBeUndefined()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('returns undefined for a non-numeric string', () => {
|
|
||||||
expect(parseMajorVersion('not-a-version')).toBeUndefined()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('resolveMSBuildArchitecture', () => {
|
|
||||||
it('always respects an explicit architecture, regardless of OS/version', () => {
|
|
||||||
expect(resolveMSBuildArchitecture('x86', true, 17)).toBe('x86')
|
|
||||||
expect(resolveMSBuildArchitecture('x64', false, 15)).toBe('x64')
|
|
||||||
expect(resolveMSBuildArchitecture('arm64', true, 17)).toBe('arm64')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('defaults to x64 on a 64-bit host with VS/MSBuild 17+', () => {
|
|
||||||
expect(resolveMSBuildArchitecture('', true, MIN_VS_VERSION_FOR_X64)).toBe(
|
|
||||||
'x64'
|
|
||||||
)
|
|
||||||
expect(resolveMSBuildArchitecture('', true, 18)).toBe('x64')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('defaults to x86 on a 64-bit host with VS/MSBuild older than 17', () => {
|
|
||||||
expect(resolveMSBuildArchitecture('', true, 16)).toBe('x86')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('defaults to x86 on a non-64-bit host even with VS/MSBuild 17+', () => {
|
|
||||||
expect(resolveMSBuildArchitecture('', false, 17)).toBe('x86')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('defaults to x86 when the VS/MSBuild version could not be determined', () => {
|
|
||||||
expect(resolveMSBuildArchitecture('', true, undefined)).toBe('x86')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# See https://github.com/krzema12/github-actions-typing
|
|
||||||
inputs:
|
|
||||||
vswhere-path:
|
|
||||||
type: string
|
|
||||||
vs-version:
|
|
||||||
type: string
|
|
||||||
vs-prerelease:
|
|
||||||
type: boolean
|
|
||||||
msbuild-architecture:
|
|
||||||
type: enum
|
|
||||||
name: Architecture
|
|
||||||
allowed-values:
|
|
||||||
- x86
|
|
||||||
- x64
|
|
||||||
- arm64
|
|
||||||
outputs:
|
|
||||||
msbuildPath:
|
|
||||||
type: string
|
|
||||||
+9
-12
@@ -1,26 +1,23 @@
|
|||||||
name: "setup-msbuild"
|
name: 'setup-msbuild'
|
||||||
description: "Helps set up MSBuild into PATH for later usage."
|
description: 'Helps set up MSBuild into PATH for later usage.'
|
||||||
author: "Microsoft"
|
author: 'Microsoft'
|
||||||
branding:
|
branding:
|
||||||
color: purple
|
color: purple
|
||||||
icon: terminal
|
icon: terminal
|
||||||
inputs:
|
inputs:
|
||||||
vswhere-path:
|
vswhere-path:
|
||||||
required: false
|
required: false
|
||||||
description: "Folder location of where vswhere.exe is located if a self-hosted agent"
|
description: 'Folder location of where vswhere.exe is located if a self-hosted agent'
|
||||||
vs-version:
|
vs-version:
|
||||||
description: "Version of Visual Studio to search; defaults to latest if not specified"
|
description: 'Version of Visual Studio to search; defaults to latest if not specified'
|
||||||
required: false
|
required: false
|
||||||
vs-prerelease:
|
vs-prerelease:
|
||||||
description: "Enable searching for pre-release versions of Visual Studio/MSBuild"
|
description: 'Enable searching for pre-release versions of Visual Studio/MSBuild'
|
||||||
required: false
|
|
||||||
msbuild-architecture:
|
|
||||||
description: 'The preferred processor architecture of MSBuild. Can be either "x86", "x64", or "arm64". "x64" is only available from Visual Studio version 17.0 and later. If left unspecified, the action auto-detects the best option: "x64" on 64-bit machines when a Visual Studio/MSBuild 17.0+ install is found, otherwise "x86".'
|
|
||||||
required: false
|
required: false
|
||||||
outputs:
|
outputs:
|
||||||
msbuildPath:
|
msbuildPath:
|
||||||
description: "The resulting location of msbuild for your inputs"
|
description: 'The resulting location of msbuild for your inputs'
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: "node24"
|
using: 'node12'
|
||||||
main: "dist/index.js"
|
main: 'dist/index.js'
|
||||||
+1
-1
@@ -7,7 +7,7 @@ This is a quick document to walk through the process of building and releasing.
|
|||||||
- Build the branch/package
|
- Build the branch/package
|
||||||
- `npm install`
|
- `npm install`
|
||||||
- `npm run build`
|
- `npm run build`
|
||||||
- `npm run pack`
|
- `npm run package`
|
||||||
- Prune the dependencies to only production
|
- Prune the dependencies to only production
|
||||||
- `npm prune --production`
|
- `npm prune --production`
|
||||||
- Uncomment `node_modules` in `.gitignore` **for this branch only**
|
- Uncomment `node_modules` in `.gitignore` **for this branch only**
|
||||||
|
|||||||
Vendored
+898
-3329
File diff suppressed because it is too large.
Load diff
Generated
+24
-8296
File diff suppressed because it is too large.
Load diff
+5
-5
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "setup-msbuild",
|
"name": "setup-msbuild",
|
||||||
"version": "4.0.0",
|
"version": "1.0.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Helps set up specific MSBuild tool into PATH for later usage.",
|
"description": "Helps set up specific MSBuild tool into PATH for later usage.",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"format": "prettier --write **/*.ts",
|
"format": "prettier --write **/*.ts",
|
||||||
"format-check": "prettier --check **/*.ts",
|
"format-check": "prettier --check **/*.ts",
|
||||||
"lint": "eslint src/**/*.ts",
|
"lint": "eslint src/**/*.ts",
|
||||||
"pack": "ncc build lib/main.js -o dist",
|
"pack": "ncc build",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"all": "npm run build && npm run format && npm run lint && npm run pack"
|
"all": "npm run build && npm run format && npm run lint && npm run pack"
|
||||||
},
|
},
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
"author": "Microsoft",
|
"author": "Microsoft",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/exec": "^1.0.3",
|
"@actions/exec": "^1.0.3",
|
||||||
"@actions/tool-cache": "^1.3.0"
|
"@actions/tool-cache": "^1.3.0"
|
||||||
},
|
},
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"@types/jest": "^24.0.23",
|
"@types/jest": "^24.0.23",
|
||||||
"@types/node": "^12.12.25",
|
"@types/node": "^12.12.25",
|
||||||
"@typescript-eslint/parser": "^2.8.0",
|
"@typescript-eslint/parser": "^2.8.0",
|
||||||
"@vercel/ncc": "^0.38.4",
|
"@zeit/ncc": "^0.20.5",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^5.16.0",
|
||||||
"eslint-plugin-github": "^2.0.0",
|
"eslint-plugin-github": "^2.0.0",
|
||||||
"eslint-plugin-jest": "^22.21.0",
|
"eslint-plugin-jest": "^22.21.0",
|
||||||
@@ -47,4 +47,4 @@
|
|||||||
"ts-jest": "^24.2.0",
|
"ts-jest": "^24.2.0",
|
||||||
"typescript": "^3.6.4"
|
"typescript": "^3.6.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+16
-129
@@ -1,7 +1,6 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as exec from '@actions/exec'
|
import * as exec from '@actions/exec'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as os from 'os'
|
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import {ExecOptions} from '@actions/exec/lib/interfaces'
|
import {ExecOptions} from '@actions/exec/lib/interfaces'
|
||||||
@@ -10,56 +9,12 @@ const IS_WINDOWS = process.platform === 'win32'
|
|||||||
const VS_VERSION = core.getInput('vs-version') || 'latest'
|
const VS_VERSION = core.getInput('vs-version') || 'latest'
|
||||||
const VSWHERE_PATH = core.getInput('vswhere-path')
|
const VSWHERE_PATH = core.getInput('vswhere-path')
|
||||||
const ALLOW_PRERELEASE = core.getInput('vs-prerelease') || 'false'
|
const ALLOW_PRERELEASE = core.getInput('vs-prerelease') || 'false'
|
||||||
const MSBUILD_ARCH_INPUT = core.getInput('msbuild-architecture')
|
|
||||||
let MSBUILD_ARCH = MSBUILD_ARCH_INPUT
|
|
||||||
|
|
||||||
// The minimum Visual Studio/MSBuild major version that ships a native x64 MSBuild.exe
|
|
||||||
export const MIN_VS_VERSION_FOR_X64 = 17
|
|
||||||
|
|
||||||
// Determines the effective MSBuild architecture to use.
|
|
||||||
// If the user explicitly specified `msbuild-architecture`, that choice is always respected.
|
|
||||||
// Otherwise (breaking change as of v4), the action auto-detects and prefers x64 when
|
|
||||||
// running on a 64-bit OS and the resolved VS/MSBuild installation is version 17.0 or later.
|
|
||||||
// If the VS version can't be determined, or the host isn't 64-bit, it falls back to x86.
|
|
||||||
export function resolveMSBuildArchitecture(
|
|
||||||
explicitArch: string,
|
|
||||||
isWindows64Bit: boolean,
|
|
||||||
vsMajorVersion: number | undefined
|
|
||||||
): string {
|
|
||||||
if (explicitArch) {
|
|
||||||
return explicitArch
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
isWindows64Bit &&
|
|
||||||
vsMajorVersion !== undefined &&
|
|
||||||
vsMajorVersion >= MIN_VS_VERSION_FOR_X64
|
|
||||||
) {
|
|
||||||
return 'x64'
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'x86'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parses the major version number out of a vswhere `installationVersion` string
|
|
||||||
// such as "17.9.34728.123". Returns undefined if it cannot be parsed.
|
|
||||||
export function parseMajorVersion(
|
|
||||||
installationVersion: string
|
|
||||||
): number | undefined {
|
|
||||||
const match = installationVersion.trim().match(/^(\d+)/)
|
|
||||||
if (!match) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
const major = parseInt(match[1], 10)
|
|
||||||
return isNaN(major) ? undefined : major
|
|
||||||
}
|
|
||||||
|
|
||||||
// if a specific version of VS is requested
|
// if a specific version of VS is requested
|
||||||
let VSWHERE_EXEC =
|
let VSWHERE_EXEC = '-products * -requires Microsoft.Component.MSBuild -property installationPath -latest '
|
||||||
'-products * -requires Microsoft.Component.MSBuild -property installationPath -latest '
|
|
||||||
if (ALLOW_PRERELEASE === 'true') {
|
if (ALLOW_PRERELEASE === 'true') {
|
||||||
VSWHERE_EXEC += ' -prerelease '
|
VSWHERE_EXEC += ' -prerelease '
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VS_VERSION !== 'latest') {
|
if (VS_VERSION !== 'latest') {
|
||||||
VSWHERE_EXEC += `-version "${VS_VERSION}" `
|
VSWHERE_EXEC += `-version "${VS_VERSION}" `
|
||||||
@@ -108,39 +63,6 @@ async function run(): Promise<void> {
|
|||||||
|
|
||||||
core.debug(`Full tool exe: ${vswhereToolExe}`)
|
core.debug(`Full tool exe: ${vswhereToolExe}`)
|
||||||
|
|
||||||
// if the user did not explicitly specify an architecture, auto-detect the
|
|
||||||
// preferred architecture based on the host OS and the resolved VS/MSBuild version
|
|
||||||
if (!MSBUILD_ARCH_INPUT) {
|
|
||||||
let vsMajorVersion: number | undefined
|
|
||||||
const versionOptions: ExecOptions = {}
|
|
||||||
versionOptions.listeners = {
|
|
||||||
stdout: (data: Buffer) => {
|
|
||||||
const installationVersion = data.toString().trim()
|
|
||||||
core.debug(`Found installation version: ${installationVersion}`)
|
|
||||||
const parsed = parseMajorVersion(installationVersion)
|
|
||||||
if (parsed !== undefined) {
|
|
||||||
vsMajorVersion = parsed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const versionExec = VSWHERE_EXEC.replace(
|
|
||||||
'-property installationPath',
|
|
||||||
'-property installationVersion'
|
|
||||||
)
|
|
||||||
await exec.exec(`"${vswhereToolExe}" ${versionExec}`, [], versionOptions)
|
|
||||||
|
|
||||||
const isWindows64Bit = os.arch() === 'x64' || os.arch() === 'arm64'
|
|
||||||
MSBUILD_ARCH = resolveMSBuildArchitecture(
|
|
||||||
MSBUILD_ARCH_INPUT,
|
|
||||||
isWindows64Bit,
|
|
||||||
vsMajorVersion
|
|
||||||
)
|
|
||||||
core.info(
|
|
||||||
`Auto-detected msbuild-architecture: ${MSBUILD_ARCH} (os.arch=${os.arch()}, vsMajorVersion=${vsMajorVersion})`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
let foundToolPath = ''
|
let foundToolPath = ''
|
||||||
const options: ExecOptions = {}
|
const options: ExecOptions = {}
|
||||||
options.listeners = {
|
options.listeners = {
|
||||||
@@ -148,42 +70,25 @@ async function run(): Promise<void> {
|
|||||||
const installationPath = data.toString().trim()
|
const installationPath = data.toString().trim()
|
||||||
core.debug(`Found installation path: ${installationPath}`)
|
core.debug(`Found installation path: ${installationPath}`)
|
||||||
|
|
||||||
// x64 and arm64 only exist in one possible location, so no fallback probing
|
let toolPath = path.join(
|
||||||
if (MSBUILD_ARCH === 'x64' || MSBUILD_ARCH === 'arm64') {
|
installationPath,
|
||||||
// x64 is actually amd64 so change to that
|
'MSBuild\\Current\\Bin\\MSBuild.exe'
|
||||||
if (MSBUILD_ARCH === 'x64') {
|
)
|
||||||
MSBUILD_ARCH = 'amd64'
|
|
||||||
}
|
core.debug(`Checking for path: ${toolPath}`)
|
||||||
let toolPath = path.join(
|
if (!fs.existsSync(toolPath)) {
|
||||||
|
toolPath = path.join(
|
||||||
installationPath,
|
installationPath,
|
||||||
`MSBuild\\Current\\Bin\\${MSBUILD_ARCH}\\MSBuild.exe`
|
'MSBuild\\15.0\\Bin\\MSBuild.exe'
|
||||||
)
|
)
|
||||||
|
|
||||||
core.debug(`Checking for path: ${toolPath}`)
|
core.debug(`Checking for path: ${toolPath}`)
|
||||||
if (!fs.existsSync(toolPath)) {
|
if (!fs.existsSync(toolPath)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
foundToolPath = toolPath
|
|
||||||
} else {
|
|
||||||
let toolPath = path.join(
|
|
||||||
installationPath,
|
|
||||||
'MSBuild\\Current\\Bin\\MSBuild.exe'
|
|
||||||
)
|
|
||||||
|
|
||||||
core.debug(`Checking for path: ${toolPath}`)
|
|
||||||
if (!fs.existsSync(toolPath)) {
|
|
||||||
toolPath = path.join(
|
|
||||||
installationPath,
|
|
||||||
'MSBuild\\15.0\\Bin\\MSBuild.exe'
|
|
||||||
)
|
|
||||||
|
|
||||||
core.debug(`Checking for path: ${toolPath}`)
|
|
||||||
if (!fs.existsSync(toolPath)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foundToolPath = toolPath
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foundToolPath = toolPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,24 +100,6 @@ async function run(): Promise<void> {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info(`Found MSBuild tool path: ${foundToolPath}`)
|
|
||||||
core.info(`Using MSBuild architecture: ${MSBUILD_ARCH}`)
|
|
||||||
|
|
||||||
// try to get the MSBuild version for diagnostic purposes; a failure here shouldn't fail the action
|
|
||||||
try {
|
|
||||||
let msbuildVersion = ''
|
|
||||||
const versionOptions: ExecOptions = {}
|
|
||||||
versionOptions.listeners = {
|
|
||||||
stdout: (data: Buffer) => {
|
|
||||||
msbuildVersion += data.toString()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await exec.exec(`"${foundToolPath}" -version -nologo`, [], versionOptions)
|
|
||||||
core.info(`Found MSBuild version: ${msbuildVersion.trim()}`)
|
|
||||||
} catch (error) {
|
|
||||||
core.debug(`Unable to determine MSBuild version: ${error.message}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// extract the folder location for the tool
|
// extract the folder location for the tool
|
||||||
const toolFolderPath = path.dirname(foundToolPath)
|
const toolFolderPath = path.dirname(foundToolPath)
|
||||||
|
|
||||||
@@ -221,7 +108,7 @@ async function run(): Promise<void> {
|
|||||||
|
|
||||||
// add tool path to PATH
|
// add tool path to PATH
|
||||||
core.addPath(toolFolderPath)
|
core.addPath(toolFolderPath)
|
||||||
core.info(`Tool path added to PATH: ${toolFolderPath}`)
|
core.debug(`Tool path added to PATH: ${toolFolderPath}`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(error.message)
|
core.setFailed(error.message)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user