From f145085501b28d6c087e4423690645c6a97afef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 28 Dec 2023 02:38:08 +0100 Subject: [PATCH] Switch to Cake for build orchestration. Also: * Switch to artifacts output paths in .NET projects. * Integrate markdownlint-cli2 as part of the build. * Simplify GitHub Actions workflows by moving logic into zig-sdk.cake. * Upload build logs/artifacts from GitHub Actions workflows. * Improve the JetBrains Fleet experience in the repo. Closes #87. --- .fleet/settings.json | 10 + .github/workflows/build.yml | 47 +- .github/workflows/package.yml | 21 +- .github/workflows/release.yml | 21 +- .gitignore | 13 +- .vscode/settings.json | 11 +- .vscode/tasks.json | 49 -- Directory.Build.props | 10 +- Directory.Build.targets | 1 - README.md | 8 +- RELEASE.md | 8 +- cake | 7 + cake.config | 8 + doc/.markdownlint-cli2.jsonc | 8 + doc/.npmrc | 6 + doc/package-lock.json | 452 ++++++++++++++++++ doc/package.json | 10 + dotnet-tools.json | 6 + nuget.config | 4 +- pkg/cache/_._ | 0 pkg/feed/_._ | 0 .../{zig-samples.proj => samples.proj} | 0 tasks.vs.json | 32 +- zig-sdk.cake | 239 +++++++++ 24 files changed, 841 insertions(+), 130 deletions(-) create mode 100644 .fleet/settings.json delete mode 100644 .vscode/tasks.json create mode 100755 cake create mode 100644 cake.config create mode 100644 doc/.markdownlint-cli2.jsonc create mode 100644 doc/.npmrc create mode 100644 doc/package-lock.json create mode 100644 doc/package.json delete mode 100644 pkg/cache/_._ delete mode 100644 pkg/feed/_._ rename src/samples/{zig-samples.proj => samples.proj} (100%) create mode 100644 zig-sdk.cake diff --git a/.fleet/settings.json b/.fleet/settings.json new file mode 100644 index 0000000..bc29498 --- /dev/null +++ b/.fleet/settings.json @@ -0,0 +1,10 @@ +{ + "files.exclude": [ + "out", + ".idea", + ".vs", + "bin", + "node_modules", + "obj" + ] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 684cbe5..166f1e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,18 +22,6 @@ jobs: - macos-13 - ubuntu-22.04 - windows-2022 - cfg: - - Debug - - Release - mode: - - Fast - - Safe - - Small - exclude: - - cfg: Debug - mode: Fast - - cfg: Debug - mode: Small runs-on: ${{ matrix.os }} steps: - name: Clone repository @@ -43,25 +31,18 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project - run: | - dotnet tool restore - dotnet build - - name: Restore samples - run: | - dotnet restore src/samples - - name: Build samples - run: | - dotnet build src/samples -c ${{ matrix.cfg }} --no-restore -p:ReleaseMode=${{ matrix.mode }} - - name: Test samples - run: | - dotnet test src/samples -c ${{ matrix.cfg }} --no-restore -p:ReleaseMode=${{ matrix.mode }} - - name: Pack samples - run: | - dotnet pack src/samples -c ${{ matrix.cfg }} --no-build - - name: Publish samples - run: | - dotnet publish src/samples -c ${{ matrix.cfg }} --no-build - - name: Clean samples + - name: Set up Node.js + uses: actions/setup-node@v4.0.1 + with: + node-version-file: doc/package.json + - name: Run Cake run: | - dotnet clean src/samples -c ${{ matrix.cfg }} + ./cake + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v4.0.0 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.os }}-Release + path: | + out/log + out/pkg diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 1712615..1e86a31 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -11,6 +11,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false DOTNET_NOLOGO: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: package: if: github.repository == 'vezel-dev/zig-sdk' @@ -23,10 +24,18 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project - run: | - dotnet tool restore - dotnet build - - name: Upload GitHub packages + - name: Set up Node.js + uses: actions/setup-node@v4.0.1 + with: + node-version-file: doc/package.json + - name: Run Cake run: | - dotnet gpr push pkg/feed/*.nupkg -k ${{ secrets.GITHUB_TOKEN }} + ./cake upload-core-github + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v4.0.0 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-windows-2022-Release + path: | + out/log + out/pkg diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e8b0054..0fee8d9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false DOTNET_NOLOGO: true + NUGET_TOKEN: ${{ secrets.NUGET_TOKEN }} jobs: release: if: github.repository == 'vezel-dev/zig-sdk' @@ -23,10 +24,18 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project - run: | - dotnet tool restore - dotnet build - - name: Upload NuGet packages + - name: Set up Node.js + uses: actions/setup-node@v4.0.1 + with: + node-version-file: doc/package.json + - name: Run Cake run: | - dotnet nuget push pkg/feed/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{ secrets.NUGET_TOKEN }} --skip-duplicate + ./cake upload-core-nuget + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v4.0.0 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-windows-2022-Release + path: | + out/log + out/pkg diff --git a/.gitignore b/.gitignore index 2d3eda9..5304f46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ -.vs -*.user -/pkg/cache/*/* -/pkg/feed/*.nupkg +/out +/src/samples/**/bin +/src/samples/**/obj /src/samples/global.json -bin -obj +*.user +.idea +.vs +node_modules diff --git a/.vscode/settings.json b/.vscode/settings.json index 265c562..6ccc6bf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,11 @@ { "files.exclude": { - "**/.vs": true, - "pkg/cache/*[!_._]": true, - "pkg/feed/*.nupkg": true, + "out": true, + "src/samples/**/bin": true, + "src/samples/**/obj": true, "src/samples/global.json": true, - "**/bin": true, - "**/obj": true + "**/.idea": true, + "**/.vs": true, + "**/node_modules": true } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index deb9065..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Build", - "presentation": { - "panel": "dedicated", - "reveal": "silent", - "revealProblems": "onProblem", - "showReuseMessage": false, - "clear": true - }, - "group": { - "kind": "build", - "isDefault": true - }, - "type": "process", - "command": "dotnet", - "args": [ - "build", - "-clp:NoSummary" - ], - "runOptions": { - "instanceLimit": 1 - }, - "problemMatcher": "$msCompile" - }, - { - "label": "Clean", - "presentation": { - "panel": "dedicated", - "reveal": "silent", - "revealProblems": "onProblem", - "showReuseMessage": false, - "clear": true - }, - "type": "process", - "command": "dotnet", - "args": [ - "clean", - "-clp:NoSummary" - ], - "runOptions": { - "instanceLimit": 1 - }, - "problemMatcher": "$msCompile" - } - ] -} diff --git a/Directory.Build.props b/Directory.Build.props index a907b69..0cce82a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,7 +10,6 @@ true latest-all - false Release true true @@ -26,10 +25,17 @@ packaging, and more, the Zig SDK makes it trivial to author native components as part of your .NET solution - without all the hassle that is usually part and parcel of building and packaging native code. 0BSD - $(MSBuildThisFileDirectory)pkg/feed/ https://docs.vezel.dev/zig-sdk true https://github.com/vezel-dev/zig-sdk.git true + + + true + $(MSBuildThisFileDirectory)out + $([MSBuild]::MakeRelative('$(MSBuildThisFileDirectory)', '$(MSBuildProjectDirectory)')) + pub + pkg + diff --git a/Directory.Build.targets b/Directory.Build.targets index 3053f78..fa1682d 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -12,7 +12,6 @@ - true zig.png PACKAGE.md diff --git a/README.md b/README.md index 35f98d9..ba28fd7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@
+ width="128" + alt="Zig SDK" />

@@ -53,6 +54,11 @@ To install an SDK package in a project, add it to your `global.json` under the For more information, please visit the [project home page](https://docs.vezel.dev/zig-sdk). +## Building + +Simply run `./cake` (a [Bash](https://www.gnu.org/software/bash) script) to +build artifacts. + ## License This project is licensed under the terms found in diff --git a/RELEASE.md b/RELEASE.md index 22d26f1..49ac122 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -9,10 +9,10 @@ Patch-level releases should be done out of the relevant major/minor branch. For example, both `1.0.1` and `1.0.5` should come out of `release/v1.0`. So, there is no need to run `dotnet nbgv prepare-release` in this case. -Before tagging a release, build the release branch locally on all platforms that -you have access to and try the [sample projects](src/samples). Verify that -nothing has regressed. Also, ensure that the release branch builds and tests -successfully on [CI](https://github.com/vezel-dev/zig-sdk/actions). +Before tagging a release, run `./cake` in the release branch locally on all +platforms that you have access to, and try the [sample projects](src/samples). +Verify that nothing has regressed. Also, ensure that the release branch builds +and tests successfully on [CI](https://github.com/vezel-dev/zig-sdk/actions). Next, run `dotnet nbgv tag` from the release branch to create a release tag, followed by `git tag -f -m -s` to sign it, and then push it diff --git a/cake b/cake new file mode 100755 index 0000000..1966150 --- /dev/null +++ b/cake @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -eou pipefail + +cd -- "$(dirname -- "$(readlink -e -- "${BASH_SOURCE[0]}")")" + +dotnet tool restore +dotnet cake zig-sdk.cake -t "${1:-default}" "${@:2}" diff --git a/cake.config b/cake.config new file mode 100644 index 0000000..db9a181 --- /dev/null +++ b/cake.config @@ -0,0 +1,8 @@ +[Paths] +Addins=out/bld/addins +Cache=out/bld/cache +Tools=out/bld/tools + +[Settings] +SkipVerification=true +EnableScriptCache=true diff --git a/doc/.markdownlint-cli2.jsonc b/doc/.markdownlint-cli2.jsonc new file mode 100644 index 0000000..caf9f0a --- /dev/null +++ b/doc/.markdownlint-cli2.jsonc @@ -0,0 +1,8 @@ +{ + "globs": [ + "**/*.md" + ], + "ignores": [ + "node_modules" + ] +} diff --git a/doc/.npmrc b/doc/.npmrc new file mode 100644 index 0000000..d8fbfc3 --- /dev/null +++ b/doc/.npmrc @@ -0,0 +1,6 @@ +audit = false +engine-strict = true +fund = false +logs-dir = ../out/log/node +logs-max = 9007199254740991 +save-exact = true diff --git a/doc/package-lock.json b/doc/package-lock.json new file mode 100644 index 0000000..2e89dee --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,452 @@ +{ + "name": "doc", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "markdownlint-cli2": "0.11.0" + }, + "engines": { + "node": "^20.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdownlint": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.32.1.tgz", + "integrity": "sha512-3sx9xpi4xlHlokGyHO9k0g3gJbNY4DI6oNEeEYq5gQ4W7UkiJ90VDAnuDl2U+yyXOUa6BX+0gf69ZlTUGIBp6A==", + "dev": true, + "dependencies": { + "markdown-it": "13.0.2", + "markdownlint-micromark": "0.1.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.11.0.tgz", + "integrity": "sha512-RmFpr+My5in8KT+H/A6ozKIVYVzZtL5t9c8DYdv0YJdljl385z44CcCVBrclpHxCGMY2tr0hZ/ca+meGGvgdnQ==", + "dev": true, + "dependencies": { + "globby": "14.0.0", + "markdownlint": "0.32.1", + "markdownlint-cli2-formatter-default": "0.0.4", + "micromatch": "4.0.5", + "strip-json-comments": "5.0.1", + "yaml": "2.3.4" + }, + "bin": { + "markdownlint-cli2": "markdownlint-cli2.js", + "markdownlint-cli2-config": "markdownlint-cli2-config.js", + "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2-formatter-default": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz", + "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==", + "dev": true, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" + } + }, + "node_modules/markdownlint-micromark": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 0000000..491bf43 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "engines": { + "node": "^20.0.0" + }, + "devDependencies": { + "markdownlint-cli2": "0.11.0" + } +} diff --git a/dotnet-tools.json b/dotnet-tools.json index 14c4330..5cfa89c 100644 --- a/dotnet-tools.json +++ b/dotnet-tools.json @@ -2,6 +2,12 @@ "version": 1, "isRoot": true, "tools": { + "cake.tool": { + "version": "4.0.0", + "commands": [ + "dotnet-cake" + ] + }, "gpr": { "version": "0.1.294", "commands": [ diff --git a/nuget.config b/nuget.config index ea1bcbf..9d8d909 100644 --- a/nuget.config +++ b/nuget.config @@ -1,6 +1,6 @@ - + @@ -10,7 +10,7 @@ - + diff --git a/pkg/cache/_._ b/pkg/cache/_._ deleted file mode 100644 index e69de29..0000000 diff --git a/pkg/feed/_._ b/pkg/feed/_._ deleted file mode 100644 index e69de29..0000000 diff --git a/src/samples/zig-samples.proj b/src/samples/samples.proj similarity index 100% rename from src/samples/zig-samples.proj rename to src/samples/samples.proj diff --git a/tasks.vs.json b/tasks.vs.json index 6f99e97..aff8dfd 100644 --- a/tasks.vs.json +++ b/tasks.vs.json @@ -6,21 +6,23 @@ "contextType": "build", "appliesTo": "/", "type": "launch", - "command": "dotnet", - "args": [ - "build", - "-clp:NoSummary" - ] - }, - { - "taskLabel": "Clean", - "contextType": "clean", - "appliesTo": "/", - "type": "launch", - "command": "dotnet", - "args": [ - "clean", - "-clp:NoSummary" + "commands": [ + { + "command": "dotnet", + "args": [ + "tool", + "restore" + ] + }, + { + "command": "dotnet", + "args": [ + "cake", + "zig-sdk.cake", + "-t", + "pack" + ] + } ] } ] diff --git a/zig-sdk.cake b/zig-sdk.cake new file mode 100644 index 0000000..25ab60d --- /dev/null +++ b/zig-sdk.cake @@ -0,0 +1,239 @@ +#addin nuget:?package=Cake.DoInDirectory&version=6.0.0 +#addin nuget:?package=Cake.Npm&version=2.0.0 +#addin nuget:?package=Cake.Npx&version=1.7.0 + +#nullable enable + +// Arguments + +var target = Argument("t", "default"); + +// Environment + +var githubToken = EnvironmentVariable("GITHUB_TOKEN"); +var nugetToken = EnvironmentVariable("NUGET_TOKEN"); + +// Paths + +var root = Context.Environment.WorkingDirectory; +var zigSdkProj = root.CombineWithFilePath("zig-sdk.proj"); +var samplesProj = root.Combine("src").Combine("samples").CombineWithFilePath("samples.proj"); +var doc = root.Combine("doc"); +var @out = root.Combine("out"); +var outLogDotnet = @out.Combine("log").Combine("dotnet"); +var outPkg = @out.Combine("pkg"); + +// Globs + +var githubGlob = new GlobPattern(outPkg.Combine("release").CombineWithFilePath("*.nupkg").FullPath); +var nugetGlob = new GlobPattern(outPkg.Combine("release").CombineWithFilePath("*.nupkg").FullPath); + +// Utilities + +DotNetMSBuildSettings ConfigureMSBuild(string category, string target) +{ + var prefix = $"{category}_{target}_{Environment.UserName}_{Environment.MachineName}_"; + var time = DateTime.Now; + + string name; + + do + { + name = $"{prefix}{time:yyyy-MM-dd_HH_mm_ss}.binlog"; + time = time.AddSeconds(1); + } + while (System.IO.File.Exists(name)); + + return new() + { + // TODO: https://github.com/dotnet/msbuild/issues/6756 + NoLogo = true, + BinaryLogger = new() + { + Enabled = true, + FileName = outLogDotnet.CombineWithFilePath(name).FullPath, + }, + ConsoleLoggerSettings = new() + { + NoSummary = true, + }, + ArgumentCustomization = args => args.Append("-ds:false"), + }; +} + +// Tasks + +Task("default") + .IsDependentOn("test") + .IsDependentOn("build"); + +Task("restore-core") + .Does(() => + DotNetRestore( + zigSdkProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("core", "restore"), + })); + +Task("restore-doc") + .Does(() => DoInDirectory(doc, () => NpmInstall())); + +Task("restore") + .IsDependentOn("restore-core") + .IsDependentOn("restore-doc"); + +Task("build-core") + .IsDependentOn("restore-core") + .Does(() => + DotNetBuild( + zigSdkProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("core", "build"), + NoRestore = true, + })); + +Task("build-doc") + .IsDependentOn("restore-doc") + .Does(() => DoInDirectory(doc, () => Npx("markdownlint-cli2"))); + +Task("build") + .IsDependentOn("build-core") + .IsDependentOn("build-doc"); + +Task("pack-core") + .IsDependentOn("build-core") + .Does(() => + DotNetPack( + zigSdkProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("core", "pack"), + NoBuild = true, + })); + +Task("pack") + .IsDependentOn("pack-core"); + +Task("test-samples-restore") + .IsDependentOn("pack-core") + .Does(() => + DotNetRestore( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "restore"), + })); + +Task("test-samples-build") + .IsDependentOn("test-samples-restore") + .Does(() => + { + foreach (var cfg in new[] { "Debug", "Release" }) + DotNetBuild( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "build"), + Configuration = cfg, + NoRestore = true, + }); + }); + +Task("test-samples-pack") + .IsDependentOn("test-samples-build") + .Does(() => + { + foreach (var cfg in new[] { "Debug", "Release" }) + DotNetPack( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "pack"), + Configuration = cfg, + NoBuild = true, + }); + }); + +Task("test-samples-publish") + .IsDependentOn("test-samples-build") + .Does(() => + { + foreach (var cfg in new[] { "Debug", "Release" }) + DotNetPublish( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "publish"), + Configuration = cfg, + NoBuild = true, + }); + }); + +Task("test-samples-test") + .IsDependentOn("test-samples-restore") + .Does(() => + { + foreach (var cfg in new[] { "Debug", "Release" }) + DotNetTest( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "test"), + Configuration = cfg, + NoBuild = true, + }); + }); + +Task("test-samples-clean") + .IsDependentOn("test-samples-restore") + .Does(() => + { + foreach (var cfg in new[] { "Debug", "Release" }) + DotNetClean( + samplesProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("samples", "clean"), + Configuration = cfg, + }); + }); + +Task("test-samples") + .IsDependentOn("test-samples-pack") + .IsDependentOn("test-samples-publish") + .IsDependentOn("test-samples-test") + .IsDependentOn("test-samples-clean"); + +Task("test") + .IsDependentOn("test-samples"); + +Task("upload-core-github") + .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref == "refs/heads/master") + .IsDependentOn("pack-core") + .Does(() => + DotNetTool( + null, + "gpr push", + new ProcessArgumentBuilder() + .AppendQuoted(githubGlob) + .AppendSwitchQuotedSecret("-k", githubToken))); + +Task("upload-core-nuget") + .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref.StartsWith("refs/tags/v")) + .IsDependentOn("pack-core") + .Does(() => + { + foreach (var pkg in GetFiles(nugetGlob)) + DotNetNuGetPush( + pkg, + new() + { + Source = "https://api.nuget.org/v3/index.json", + ApiKey = nugetToken, + SkipDuplicate = true, + }); + }); + +RunTarget(target);