10 Commits
Author SHA1 Message Date
cneicy c08334107b fix: download release SDK directly from Microsoft Blob
Publish NuGet packages / publish (push) Canceled after 1s
Publish UPM package / publish (push) Successful in 2s
2026-11-06 19:26:44 +08:00
cneicy 0127fae182 feat: update Godot integration and coordinated package dependencies 2026-11-06 19:13:11 +08:00
cneicy fd3788e2ce chore: align SDK dependencies and document reusable capabilities
Publish UPM package / publish (push) Successful in 2s
Publish NuGet packages / publish (push) Successful in 3m3s
2026-09-29 10:14:37 +08:00
cneicy c210428cb0 chore: exclude .NET metadata from UPM packages
Publish UPM package / publish (push) Successful in 3s
Publish NuGet packages / publish (push) Successful in 43s
2026-09-05 04:06:03 +08:00
cneicy fcb2b2fbe6 ci: trust bundled CAs during NuGet publish 2026-09-05 04:04:22 +08:00
cneicy cc1bbdfdc0 ci: provide OpenSSL for .NET packaging 2026-09-05 04:00:54 +08:00
cneicy 0b245871ad ci: run .NET packaging in invariant mode 2026-09-05 03:56:36 +08:00
cneicy 75b544dad8 ci: bootstrap .NET SDK without system packages 2026-09-05 03:53:45 +08:00
cneicy eee276a242 ci: publish NuGet without external actions 2026-09-05 03:49:18 +08:00
cneicy 66f8a250c3 ci: install .NET prerequisites for package publishing 2026-09-05 03:44:54 +08:00
10 changed files with 190 additions and 42 deletions

No files matched your search

+90 -18
View File
@@ -14,38 +14,110 @@ jobs:
packages: write packages: write
env: env:
NUGET_AUTH_TOKEN: ${{ secrets.SHRINKSDK_PACKAGE_TOKEN }} NUGET_AUTH_TOKEN: ${{ secrets.SHRINKSDK_PACKAGE_TOKEN }}
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: '1'
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
LD_LIBRARY_PATH: /opt/dotnet-libs/usr/lib/x86_64-linux-gnu
SSL_CERT_FILE: /opt/ca-certificates.crt
steps: steps:
- name: Checkout tagged source - name: Fetch exact tagged source
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Validate tag and pack projects
env: env:
GITEA_REF: ${{ gitea.ref }} GITEA_REF: ${{ gitea.ref }}
GITEA_REPOSITORY: ${{ gitea.repository }}
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
tag="${GITEA_REF#refs/tags/}" tag="${GITEA_REF#refs/tags/}"
version="$(node -p "require('./package.json').version")" case "$tag" in
v[0-9]*) ;;
*) echo "Expected a version tag ref, got: $GITEA_REF" >&2; exit 1 ;;
esac
export SHRINKSDK_ARCHIVE_URL="https://git.crash.work/${GITEA_REPOSITORY}/archive/${tag}.tar.gz"
node --input-type=module <<'NODE'
import { writeFile } from 'node:fs/promises';
const response = await fetch(process.env.SHRINKSDK_ARCHIVE_URL);
if (!response.ok) {
throw new Error(`Release archive download failed: ${response.status} ${response.statusText}`);
}
await writeFile('release.tar.gz', new Uint8Array(await response.arrayBuffer()));
NODE
mkdir release
tar -xzf release.tar.gz --strip-components=1 -C release
rm -f release.tar.gz
printf '%s' "$tag" > release/.shrink-sdk-release-tag
- name: Install .NET 8 SDK
shell: bash
run: |
set -euo pipefail
node --input-type=module <<'NODE'
import { writeFile } from 'node:fs/promises';
import { rootCertificates } from 'node:tls';
await writeFile('/opt/ca-certificates.crt', rootCertificates.join('\n'));
const metadataResponse = await fetch('https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/8.0/releases.json');
if (!metadataResponse.ok) throw new Error(`Release metadata download failed: ${metadataResponse.status}`);
const metadata = await metadataResponse.json();
const sdkVersion = metadata['latest-sdk'];
const release = metadata.releases.find(item => item.sdk?.version === sdkVersion);
const file = release?.sdk?.files?.find(item => item.rid === 'linux-x64' && item.name.endsWith('.tar.gz'));
if (!file) throw new Error(`Linux x64 SDK archive not found for ${sdkVersion}`);
const archiveUrl = `https://dotnetcli.blob.core.windows.net/dotnet/Sdk/${sdkVersion}/dotnet-sdk-${sdkVersion}-linux-x64.tar.gz`;
const archiveResponse = await fetch(archiveUrl);
if (!archiveResponse.ok) throw new Error(`SDK download failed: ${archiveResponse.status}`);
await writeFile('/tmp/dotnet-sdk.tar.gz', new Uint8Array(await archiveResponse.arrayBuffer()));
const poolUrl = 'https://deb.debian.org/debian-security/pool/updates/main/o/openssl/';
const poolResponse = await fetch(poolUrl);
if (!poolResponse.ok) throw new Error(`OpenSSL package index download failed: ${poolResponse.status}`);
const poolIndex = await poolResponse.text();
const packages = [...poolIndex.matchAll(/href="(libssl3_[^"]+_amd64\.deb)"/g)].map(match => match[1]).sort();
const packageName = packages.at(-1);
if (!packageName) throw new Error('Debian libssl3 package was not found');
const packageResponse = await fetch(poolUrl + packageName);
if (!packageResponse.ok) throw new Error(`OpenSSL package download failed: ${packageResponse.status}`);
await writeFile('/tmp/libssl3.deb', new Uint8Array(await packageResponse.arrayBuffer()));
NODE
mkdir -p /opt/dotnet
tar -xzf /tmp/dotnet-sdk.tar.gz -C /opt/dotnet
mkdir -p /opt/dotnet-libs
dpkg-deb -x /tmp/libssl3.deb /opt/dotnet-libs
rm -f /tmp/dotnet-sdk.tar.gz
rm -f /tmp/libssl3.deb
/opt/dotnet/dotnet --info
- name: Validate, pack and publish
shell: bash
run: |
set -euo pipefail
: "${NUGET_AUTH_TOKEN:?SHRINKSDK_PACKAGE_TOKEN is required}"
export PATH="/opt/dotnet:$PATH"
cd release
tag="$(cat .shrink-sdk-release-tag)"
projects=()
if [[ -d DotNet~ ]]; then
while IFS= read -r -d '' project; do projects+=("$project"); done < <(find DotNet~ -type f -name '*.csproj' -print0)
fi
if [[ -d Godot~ ]]; then
while IFS= read -r -d '' project; do projects+=("$project"); done < <(find Godot~ -type f -name '*.csproj' -print0)
fi
if [[ "${#projects[@]}" -eq 0 ]]; then
while IFS= read -r -d '' project; do projects+=("$project"); done < <(find . -maxdepth 1 -type f -name '*.csproj' -print0)
fi
test "${#projects[@]}" -gt 0
if [[ -f package.json ]]; then
version="$(node -p "require('./package.json').version")"
else
version="$(dotnet msbuild "${projects[0]}" -getProperty:Version -nologo)"
fi
test "$tag" = "v$version" test "$tag" = "v$version"
mkdir -p packages mkdir -p packages
mapfile -d '' projects < <(find DotNet~ Godot~ -type f -name '*.csproj' -print0 2>/dev/null || true)
test "${#projects[@]}" -gt 0
for project in "${projects[@]}"; do for project in "${projects[@]}"; do
dotnet restore "$project" --configfile NuGet.Config dotnet restore "$project" --configfile NuGet.Config
dotnet pack "$project" --configuration Release --no-restore --output "$PWD/packages" --include-symbols --include-source dotnet pack "$project" --configuration Release --no-restore --output "$PWD/packages" --include-symbols --include-source
done done
find packages -maxdepth 1 -name '*.nupkg' -type f | grep -q . find packages -maxdepth 1 -name '*.nupkg' -type f | grep -q .
- name: Publish packages
shell: bash
run: |
set -euo pipefail
: "${NUGET_AUTH_TOKEN:?SHRINKSDK_PACKAGE_TOKEN is required}"
dotnet nuget push 'packages/*.nupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate dotnet nuget push 'packages/*.nupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate
if compgen -G 'packages/*.snupkg' > /dev/null; then if compgen -G 'packages/*.snupkg' > /dev/null; then
dotnet nuget push 'packages/*.snupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate dotnet nuget push 'packages/*.snupkg' --api-key "$NUGET_AUTH_TOKEN" --source https://git.crash.work/api/packages/ShrinkSDK/nuget/index.json --skip-duplicate
+2
View File
@@ -10,3 +10,5 @@ DotNet~/
Godot~/ Godot~/
NuGet.Config NuGet.Config
Directory.Build.props Directory.Build.props
NuGet.Config.meta
Directory.Build.props.meta
+11
View File
@@ -2,6 +2,17 @@
本文件记录 `ShrinkApp.Starter.Basic` 的包内变更。 本文件记录 `ShrinkApp.Starter.Basic` 的包内变更。
## [0.4.0] - 2026-11-06
### Added
- `ShrinkBasicComposition.CreateEntries(...)` 接受 `ShrinkDataSaverAppModuleConfig`,可把自定义存储或运行时配置传入默认组合。
- `ShrinkAppBasicContextComposition.Configure(host, ShrinkDataSaverRuntimeConfig)` 支持在 Context 组合中覆盖 DataSaver 配置。
### Changed
- 默认组合升级到 `ShrinkDataSaver 2.5.0` 与 `ShrinkDataSaver.Integration.App 0.3.0`。
## [0.2.2] - 2026-08-28 ## [0.2.2] - 2026-08-28
### Changed ### Changed
+7
View File
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1cac07a63ed752846b4459b2d94bb585
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+8 -2
View File
@@ -22,9 +22,15 @@ public static class ShrinkBasicComposition
} }
public static IReadOnlyList<ShrinkLoaderEntry> CreateEntries(ShrinkAppServices services, public static IReadOnlyList<ShrinkLoaderEntry> CreateEntries(ShrinkAppServices services,
ShrinkNetworkAppModuleConfig? network = null) => new[] ShrinkNetworkAppModuleConfig? network = null) => CreateEntries(services,
network, new ShrinkDataSaverAppModuleConfig(services));
public static IReadOnlyList<ShrinkLoaderEntry> CreateEntries(ShrinkAppServices services,
ShrinkNetworkAppModuleConfig? network,
ShrinkDataSaverAppModuleConfig dataSaver) => new[]
{ {
new ShrinkLoaderEntry("datasaver", "shrink.datasaver", services), new ShrinkLoaderEntry("datasaver", "shrink.datasaver",
dataSaver ?? new ShrinkDataSaverAppModuleConfig(services)),
new ShrinkLoaderEntry("command", "shrink.command", services), new ShrinkLoaderEntry("command", "shrink.command", services),
new ShrinkLoaderEntry("network", "shrink.network", network ?? new ShrinkNetworkAppModuleConfig new ShrinkLoaderEntry("network", "shrink.network", network ?? new ShrinkNetworkAppModuleConfig
{ {
+7 -7
View File
@@ -5,17 +5,17 @@
<AssemblyName>ShrinkApp.Starter.Basic</AssemblyName> <AssemblyName>ShrinkApp.Starter.Basic</AssemblyName>
<RootNamespace>ShrinkApp.Starter.Basic</RootNamespace> <RootNamespace>ShrinkApp.Starter.Basic</RootNamespace>
<PackageId>ShrinkSDK.App.Starter.Basic</PackageId> <PackageId>ShrinkSDK.App.Starter.Basic</PackageId>
<Version>0.3.0</Version> <Version>0.4.1</Version>
<Description>Engine-neutral basic ShrinkApp composition.</Description> <Description>Engine-neutral basic ShrinkApp composition.</Description>
<ShrinkCodeGenEnabled>false</ShrinkCodeGenEnabled> <ShrinkCodeGenEnabled>false</ShrinkCodeGenEnabled>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Runtime\*.cs" /> <Compile Include="Runtime\*.cs" />
<PackageReference Include="ShrinkSDK.App.Core" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.App.Core" Version="0.2.4" />
<PackageReference Include="ShrinkSDK.Context.Core" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.Context.Core" Version="0.3.1" />
<PackageReference Include="ShrinkSDK.Context.AppAdapter" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.Context.AppAdapter" Version="0.2.5" />
<PackageReference Include="ShrinkSDK.Command.Integration.App" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.Command.Integration.App" Version="0.2.6" />
<PackageReference Include="ShrinkSDK.DataSaver.Integration.App" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.DataSaver.Integration.App" Version="0.3.1" />
<PackageReference Include="ShrinkSDK.Network.Integration.App" Version="0.2.0" /> <PackageReference Include="ShrinkSDK.Network.Integration.App" Version="0.2.6" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+32
View File
@@ -0,0 +1,32 @@
fileFormatVersion: 2
guid: 2d2841b519d2ca74d81604457c6e9742
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:
+10
View File
@@ -47,3 +47,13 @@ Godot 和普通 .NET 项目安装 `ShrinkSDK.App.Starter.Basic`;可打包源
- 是否把命令输出打印到控制台 - 是否把命令输出打印到控制台
- 启动时是否自动执行默认命令 - 启动时是否自动执行默认命令
- 命令输出区最多保留多少行 - 命令输出区最多保留多少行
## 可复用能力
<!-- shrink:capabilities -->
Capability: 组合 Command、DataSaver、Network,提供最小启动与调试样例
Aliases: 起盘 启动应用 starter 样例 演示
Limits: 不预置背包、战斗或任务系统;场景对象属于宿主主线程
Extension: Starter settings 和 Context 组合条目
Evidence: [ShrinkAppBasicSampleController](Runtime/ShrinkAppBasicSampleController.cs)
<!-- /shrink:capabilities -->
+9 -1
View File
@@ -5,6 +5,7 @@ using System.Linq;
using ShrinkCommand.Integration.App; using ShrinkCommand.Integration.App;
using ShrinkCommand.Integration; using ShrinkCommand.Integration;
using ShrinkContext.AppAdapter; using ShrinkContext.AppAdapter;
using ShrinkDataSaver;
using ShrinkDataSaver.Integration.App; using ShrinkDataSaver.Integration.App;
using ShrinkDataSaver.Integration; using ShrinkDataSaver.Integration;
using ShrinkNetwork.Integration.App; using ShrinkNetwork.Integration.App;
@@ -39,13 +40,20 @@ namespace ShrinkApp.Starter.Basic
} }
public static void Configure(ShrinkAppLoaderHost host) public static void Configure(ShrinkAppLoaderHost host)
{
Configure(host, null);
}
public static void Configure(ShrinkAppLoaderHost host,
ShrinkDataSaverRuntimeConfig? dataSaverRuntimeConfig)
{ {
if (host == null) if (host == null)
throw new System.ArgumentNullException(nameof(host)); throw new System.ArgumentNullException(nameof(host));
RegisterOrReplace(host, "shrink.network", static () => new ShrinkNetworkAppComponent()); RegisterOrReplace(host, "shrink.network", static () => new ShrinkNetworkAppComponent());
RegisterOrReplace(host, "shrink.command", static () => new ShrinkCommandAppComponent()); RegisterOrReplace(host, "shrink.command", static () => new ShrinkCommandAppComponent());
RegisterOrReplace(host, "shrink.datasaver", static () => new ShrinkDataSaverAppComponent()); RegisterOrReplace(host, "shrink.datasaver",
() => new ShrinkDataSaverAppComponent(dataSaverRuntimeConfig));
host.AddModuleComponent("shrink.integration.command-network", host.AddModuleComponent("shrink.integration.command-network",
static () => new ShrinkCommandNetworkIntegrationComponent()); static () => new ShrinkCommandNetworkIntegrationComponent());
host.AddModuleComponent("shrink.integration.command-eventbus", host.AddModuleComponent("shrink.integration.command-eventbus",
+14 -14
View File
@@ -1,23 +1,23 @@
{ {
"name": "com.cneicy.shrink-app-starter-basic", "name": "com.cneicy.shrink-app-starter-basic",
"version": "0.3.0", "version": "0.4.1",
"displayName": "ShrinkApp Starter Basic", "displayName": "ShrinkApp Starter Basic",
"description": "ShrinkApp 最小起盘 Starter,提供向导、入口场景和 DataSaver 示例。", "description": "ShrinkApp 最小起盘 Starter,提供向导、入口场景和 DataSaver 示例。",
"unity": "2022.3", "unity": "2022.3",
"dependencies": { "dependencies": {
"com.cneicy.shrink-app-core": "0.2.0", "com.cneicy.shrink-app-core": "0.2.4",
"com.cneicy.shrink-context-core": "0.2.0", "com.cneicy.shrink-context-core": "0.3.1",
"com.cneicy.shrink-context-app-adapter": "0.2.0", "com.cneicy.shrink-context-app-adapter": "0.2.5",
"com.cneicy.shrink-command": "0.3.0", "com.cneicy.shrink-command": "0.4.3",
"com.cneicy.shrink-command-integration-app": "0.2.0", "com.cneicy.shrink-command-integration-app": "0.2.6",
"com.cneicy.shrink-datasaver": "2.3.0", "com.cneicy.shrink-datasaver": "2.5.0",
"com.cneicy.shrink-datasaver-integration-app": "0.2.0", "com.cneicy.shrink-datasaver-integration-app": "0.3.1",
"com.cneicy.shrink-network": "0.3.0", "com.cneicy.shrink-network": "0.4.3",
"com.cneicy.shrink-network-integration-app": "0.2.0", "com.cneicy.shrink-network-integration-app": "0.2.6",
"com.cneicy.shrink-command-integration-eventbus": "0.2.0", "com.cneicy.shrink-command-integration-eventbus": "0.2.6",
"com.cneicy.shrink-datasaver-integration-eventbus": "2.2.0", "com.cneicy.shrink-datasaver-integration-eventbus": "2.2.6",
"com.cneicy.shrink-network-integration-eventbus": "0.2.0", "com.cneicy.shrink-network-integration-eventbus": "0.2.6",
"com.cneicy.shrink-command-integration-network": "0.2.0", "com.cneicy.shrink-command-integration-network": "0.2.6",
"com.unity.ugui": "1.0.0", "com.unity.ugui": "1.0.0",
"com.cysharp.unitask": "2.5.10" "com.cysharp.unitask": "2.5.10"
}, },