Alby's blog

世上没有巧合,只有巧合的假象。

0%

为 mediasoup-worker 制作 NuGet 包

一、概述

mediaosup-worker 目前提供了包括 Windows、Linux、macOS 的预编译可执行程序。如果在 .Net 下使用,可以制作成 NuGet 包。

二、基本步骤

1、下载并解压

mediasoup-worker 预编译 下载 Windows、Linux、macOS 三个平台的压缩包。

比如 mediaosup-worker 3.15.7 的 macOS arm64 版的下载链接为:https://github.com/versatica/mediasoup/releases/download/3.15.7/mediasoup-worker-3.15.7-darwin-arm64.tgz

2、制作 NuGet 包

制作 NuGet 包有三种方式:dotnet CLI, NuGet CLI, MSBuild。因为要制作的 NuGet 包本身并不依赖于 .Net,使用 NuGet CLI 更方便。

3、发布 NuGet 包

发布使用 dotnet CLI, NuGet CLI 都可以。

三、脚本

1、制作(build_nuget.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env bash
set -e

VERSION=${1:-"3.15.7"}
PACKAGE_NAME="Tubumu.Mediasoup.Runtimes"
OUT_DIR="output"
WORK_DIR="build"
BASE_URL="https://github.com/versatica/mediasoup/releases/download/${VERSION}"

# [.NET RID 目录](https://learn.microsoft.com/zh-cn/dotnet/core/rid-catalog)

# 定义平台映射表
# declare -A 是 Bash 4.0+ 的功能
# declare -A PLATFORMS=(
# ["darwin-arm64"]="osx-arm64"
# ["darwin-x64"]="osx-x64"
# ["linux-arm64-kernel6"]="linux-arm64"
# ["linux-x64-kernel6"]="linux-x64"
# ["win32-x64"]="win-x64"
# )

# 定义平台映射表(key|value)
PLATFORMS=(
"darwin-arm64|osx-arm64"
"darwin-x64|osx-x64"
"linux-arm64-kernel6|linux-arm64"
"linux-x64-kernel6|linux-x64"
"win32-x64|win-x64"
)

echo "➡️ 清理旧构建目录..."
rm -rf "$WORK_DIR/runtimes"
mkdir -p "$WORK_DIR" "$OUT_DIR"

echo "📦 下载并解压文件..."
for entry in "${PLATFORMS[@]}"; do
key="${entry%%|*}"
rid="${entry##*|}"
url="${BASE_URL}/mediasoup-worker-${VERSION}-${key}.tgz"
tgz_file="$WORK_DIR/$key.tgz"

if [[ -f "$tgz_file" ]]; then
echo "✅ 已存在: $tgz_file,跳过下载"
else
echo "🔽 下载 $url"
curl -L "$url" -o "$tgz_file"
fi

echo "📂 解压到 runtimes/$rid/native/"
mkdir -p "$WORK_DIR/runtimes/$rid/native"
tar -xzf "$tgz_file" -C "$WORK_DIR/runtimes/$rid/native"
done

echo "📝 生成 .nuspec 文件..."
cat > "$WORK_DIR/$PACKAGE_NAME.nuspec" <<EOF
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>$PACKAGE_NAME</id>
<version>$VERSION</version>
<authors>Alby</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Cross-platform mediasoup-worker executables for multiple runtimes.</description>
<tags>mediasoup native runtimes</tags>
</metadata>
<files>
EOF

for entry in "${PLATFORMS[@]}"; do
key="${entry%%|*}"
rid="${entry##*|}"
native_path="runtimes/$rid/native"

if [[ "$rid" == "win-x64" ]]; then
echo " <file src=\"$native_path/mediasoup-worker.exe\" target=\"$native_path/mediasoup-worker.exe\" />" >> "$WORK_DIR/$PACKAGE_NAME.nuspec"
else
echo " <file src=\"$native_path/mediasoup-worker\" target=\"$native_path/mediasoup-worker\" />" >> "$WORK_DIR/$PACKAGE_NAME.nuspec"
fi
done

echo " </files>
</package>" >> "$WORK_DIR/$PACKAGE_NAME.nuspec"

echo "📦 构建 NuGet 包..."
pushd "$WORK_DIR" > /dev/null
nuget pack "$PACKAGE_NAME.nuspec" -OutputDirectory "../$OUT_DIR"
popd > /dev/null

echo "✅ 打包完成: $OUT_DIR/${PACKAGE_NAME}.${VERSION}.nupkg"

2、发布(publish_nuget.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env bash
set -e

# 参数
PACKAGE_NAME="Tubumu.Mediasoup.Runtimes"
VERSION=${1:-"3.15.7"}
API_KEY=${2}

if [[ -z "$API_KEY" ]]; then
echo "❌ 错误: 你需要提供 NuGet API Key。"
echo "用法: ./publish_nuget.sh <mediasoup-worker-version> <your-NuGet-api-key>"
exit 1
fi

NUPKG_FILE="output/${PACKAGE_NAME}.${VERSION}.nupkg"

if [[ ! -f "$NUPKG_FILE" ]]; then
echo "❌ 找不到 NuGet 包: $NUPKG_FILE"
exit 1
fi

echo "🚀 正在发布 $NUPKG_FILE 到 NuGet.org..."

dotnet nuget push "$NUPKG_FILE" \
--api-key "$API_KEY" \
--source "https://api.NuGet.org/v3/index.json" \
--skip-duplicate

echo "✅ 发布完成!"

发布命令:./publish_nuget.sh <mediasoup-worker-version> <your_API_key>

参考资料

mediasoup-worker 预编译
.NET RID 目录
使用 NuGet.exe CLI 创建包
发布 NuGet 包