From ccffed4e194156d7aef1cf1232b31abacea70ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 12 Dec 2023 02:46:29 +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 cathode.cake. * Upload build logs/artifacts from GitHub Actions workflows. * Improve the JetBrains Fleet experience in the repo. Closes #64. --- .fleet/settings.json | 8 + .github/workflows/build.yml | 18 +- .github/workflows/package.yml | 22 +- .github/workflows/release.yml | 22 +- .gitignore | 9 +- .vscode/launch.json | 4 +- .vscode/settings.json | 7 +- .vscode/tasks.json | 49 ---- Directory.Build.props | 10 +- README.md | 10 +- RELEASE.md | 8 +- cake | 7 + cake.config | 8 + doc/.markdownlint-cli2.jsonc | 8 + doc/.npmrc | 6 + doc/package-lock.json | 430 ++++++++++++++++++++++++++++++++++ doc/package.json | 10 + dotnet-tools.json | 6 + nuget.config | 4 +- pkg/cache/_._ | 0 pkg/feed/_._ | 0 ruptura.cake | 160 +++++++++++++ src/trimming/trimming.csproj | 1 + tasks.vs.json | 30 +-- 24 files changed, 738 insertions(+), 99 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/_._ create mode 100644 ruptura.cake diff --git a/.fleet/settings.json b/.fleet/settings.json new file mode 100644 index 0000000..591e558 --- /dev/null +++ b/.fleet/settings.json @@ -0,0 +1,8 @@ +{ + "files.exclude": [ + "out", + ".idea", + ".vs", + "node_modules" + ] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f75e771..e762c16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,10 +30,22 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project + - name: Set up Node.js + uses: actions/setup-node@v4.0.0 + with: + node-version-file: doc/package.json + - name: Run Cake run: | - dotnet tool restore - dotnet publish ruptura.proj -c ${{ matrix.cfg }} + ./cake -c ${{ matrix.cfg }} - name: Run samples run: | dotnet example --all + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v3.1.3 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.os }}-${{ matrix.cfg }} + path: | + out/log + out/pkg + out/pub diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 1be917f..4d719ec 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/ruptura' @@ -23,10 +24,19 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project - run: | - dotnet tool restore - dotnet build ruptura.proj - - name: Upload GitHub packages + - name: Set up Node.js + uses: actions/setup-node@v4.0.0 + 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@v3.1.3 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.os }}-${{ matrix.cfg }} + path: | + out/log + out/pkg + out/pub diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6388441..9d8b227 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/ruptura' @@ -23,10 +24,19 @@ jobs: submodules: recursive - name: Set up .NET uses: actions/setup-dotnet@v4.0.0 - - name: Build project - run: | - dotnet tool restore - dotnet build ruptura.proj -c Release - - name: Upload NuGet packages + - name: Set up Node.js + uses: actions/setup-node@v4.0.0 + 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 -c Release + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v3.1.3 + with: + name: ${{ github.workflow }}-${{ github.run_number }}-${{ github.run_attempt }}-windows-2022-Release + path: | + out/log + out/pkg + out/pub diff --git a/.gitignore b/.gitignore index 0a46d42..1954103 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ -.vs +/out *.user -/pkg/cache/*/* -/pkg/feed/*.nupkg -bin -obj +.idea +.vs +node_modules diff --git a/.vscode/launch.json b/.vscode/launch.json index 92e5302..e374c4f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -31,7 +31,7 @@ }, "console": "integratedTerminal", "cwd": "${workspaceFolder}/src/samples/${input:pickSample}", - "program": "${workspaceFolder}/src/samples/${input:pickSample}/bin/Debug/${input:pickSample}.dll" + "program": "${workspaceFolder}/out/bin/src/samples/${input:pickSample}/debug/${input:pickSample}.dll" }, { "name": ".NET: Launch (Integrated)", @@ -49,7 +49,7 @@ }, "console": "externalTerminal", "cwd": "${workspaceFolder}/src/samples/${input:pickSample}", - "program": "${workspaceFolder}/src/samples/${input:pickSample}/bin/Debug/${input:pickSample}.dll" + "program": "${workspaceFolder}/out/bin/src/samples/${input:pickSample}/debug/${input:pickSample}.dll" }, { "name": ".NET: Attach", diff --git a/.vscode/settings.json b/.vscode/settings.json index 5cb3d40..e084c14 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,8 @@ { "files.exclude": { + "out": true, + "**/.idea": true, "**/.vs": true, - "pkg/cache/*[!_._]": true, - "pkg/feed/*.nupkg": true, - "**/bin": true, - "**/obj": 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 78a821d..886e526 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,7 +10,6 @@ true latest-all - false true true true @@ -30,7 +29,6 @@ all without the user writing a single line of native code. Additionally, a library facilitating common function hooking and memory manipulation scenarios is available for use by the injected assembly. 0BSD - $(MSBuildThisFileDirectory)pkg/feed/ https://docs.vezel.dev/ruptura true false @@ -40,4 +38,12 @@ is available for use by the injected assembly. true true + + + true + $(MSBuildThisFileDirectory)out + $([MSBuild]::MakeRelative('$(MSBuildThisFileDirectory)', '$(MSBuildProjectDirectory)')) + pub + pkg + diff --git a/README.md b/README.md index e58b291..fd6156d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@
+ width="128" + alt="Ruptura" />

@@ -70,6 +71,13 @@ samples can be run with For more information, please visit the [project home page](https://docs.vezel.dev/ruptura). +## Building + +Simply run `./cake` (a [Bash](https://www.gnu.org/software/bash) script) to +build artifacts. This will use the `Debug` configuration by default, which is +suitable for development and debugging. Pass `-c Release` instead to use that +configuration, resulting in an optimized build. + ## License This project is licensed under the terms found in diff --git a/RELEASE.md b/RELEASE.md index b5392ef..8222841 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 run the [sample programs](src/samples). Verify that -nothing has regressed. Also, ensure that the release branch builds and tests -successfully on [CI](https://github.com/vezel-dev/ruptura/actions). +Before tagging a release, run `./cake` in the release branch locally on all +platforms that you have access to, and test the [sample programs](src/samples). +Verify that nothing has regressed. Also, ensure that the release branch builds +and tests successfully on [CI](https://github.com/vezel-dev/ruptura/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..17af4cc --- /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 ruptura.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..0f528be --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,430 @@ +{ + "name": "doc", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "markdownlint-cli2": "0.10.0" + }, + "engines": { + "node": "20.5.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/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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "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.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "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.31.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", + "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", + "dev": true, + "dependencies": { + "markdown-it": "13.0.1", + "markdownlint-micromark": "0.1.7" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/markdownlint-cli2": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", + "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", + "dev": true, + "dependencies": { + "globby": "13.2.2", + "markdownlint": "0.31.1", + "markdownlint-cli2-formatter-default": "0.0.4", + "micromatch": "4.0.5", + "strip-json-comments": "5.0.1", + "yaml": "2.3.2" + }, + "bin": { + "markdownlint-cli2": "markdownlint-cli2.js", + "markdownlint-cli2-config": "markdownlint-cli2-config.js", + "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" + }, + "engines": { + "node": ">=16" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "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/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 0000000..6716c98 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "engines": { + "node": "20.5.0" + }, + "devDependencies": { + "markdownlint-cli2": "0.10.0" + } +} diff --git a/dotnet-tools.json b/dotnet-tools.json index 5013f7b..3d3ed4c 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" + ] + }, "dotnet-counters": { "version": "8.0.452401", "commands": [ diff --git a/nuget.config b/nuget.config index 1a3b2d4..5a05f25 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/ruptura.cake b/ruptura.cake new file mode 100644 index 0000000..2d65d4d --- /dev/null +++ b/ruptura.cake @@ -0,0 +1,160 @@ +#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"); +var configuration = Argument("c", "Debug"); + +// Environment + +var githubToken = EnvironmentVariable("GITHUB_TOKEN"); +var nugetToken = EnvironmentVariable("NUGET_TOKEN"); + +// Paths + +var root = Context.Environment.WorkingDirectory; +var rupturaProj = root.CombineWithFilePath("ruptura.proj"); +var doc = root.Combine("doc"); +var trimmingCsproj = root.Combine("src").Combine("trimming").CombineWithFilePath("trimming.csproj"); +var @out = root.Combine("out"); +var outLogDotnet = @out.Combine("log").Combine("dotnet"); +var outPkg = @out.Combine("pkg"); + +// Globs + +var githubGlob = new GlobPattern(outPkg.Combine("debug").CombineWithFilePath("*.nupkg").FullPath); +var nugetGlob = new GlobPattern(outPkg.Combine("release").CombineWithFilePath("*.nupkg").FullPath); + +// Utilities + +DotNetMSBuildSettings ConfigureMSBuild(string target) +{ + var prefix = $"{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("build") + .IsDependentOn("pack"); + +Task("restore-core") + .Does(() => + DotNetRestore( + rupturaProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("restore"), + })); + +Task("restore-doc") + .Does(() => DoInDirectory(doc, () => NpmInstall())); + +Task("restore") + .IsDependentOn("restore-core") + .IsDependentOn("restore-doc"); + +Task("build-core") + .IsDependentOn("restore-core") + .Does(() => + DotNetBuild( + rupturaProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("build"), + Configuration = configuration, + NoRestore = true, + })); + +Task("build-trimming") + .IsDependentOn("build-core") + .Does(() => + DotNetPublish( + trimmingCsproj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("publish"), + Configuration = configuration, + NoBuild = true, + })); + +Task("build-doc") + .IsDependentOn("restore-doc") + .Does(() => DoInDirectory(doc, () => Npx("markdownlint-cli2"))); + +Task("build") + .IsDependentOn("build-trimming") + .IsDependentOn("build-doc"); + +Task("pack-core") + .IsDependentOn("build-core") + .Does(() => + DotNetPack( + rupturaProj.FullPath, + new() + { + MSBuildSettings = ConfigureMSBuild("pack"), + Configuration = configuration, + NoBuild = true, + })); + +Task("pack") + .IsDependentOn("pack-core"); + +Task("upload-core-github") + .WithCriteria(BuildSystem.GitHubActions.Environment.Workflow.Ref == "refs/heads/master") + .WithCriteria(configuration == "Debug") + .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")) + .WithCriteria(configuration == "Release") + .IsDependentOn("pack-core") + .Does(() => + DotNetNuGetPush( + nugetGlob.Pattern, + new() + { + Source = "https://api.nuget.org/v3/index.json", + ApiKey = nugetToken, + SkipDuplicate = true, + })); + +RunTarget(target); diff --git a/src/trimming/trimming.csproj b/src/trimming/trimming.csproj index 0413243..43fd458 100644 --- a/src/trimming/trimming.csproj +++ b/src/trimming/trimming.csproj @@ -10,6 +10,7 @@ Exe true Vezel.Ruptura.Trimming + true true diff --git a/tasks.vs.json b/tasks.vs.json index 6f99e97..f794d4e 100644 --- a/tasks.vs.json +++ b/tasks.vs.json @@ -6,21 +6,21 @@ "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", + "ruptura.cake" + ] + } ] } ]