BepInEx插件打包全流程实战指南:从环境搭建到CI/CD最佳实践
问题定位:插件开发者的打包困境与解决方案
作为BepInEx插件开发者,你是否经常面临这些问题:手动编译步骤繁琐易错、不同平台发布包不兼容、依赖管理混乱导致插件加载失败、版本号管理缺乏规范?本文将通过"问题定位→核心原理→实施策略→优化方案→实战案例"的五段式结构,帮助你掌握高效、可靠的插件打包技术,实现从源码到跨平台发布包的全流程自动化。
插件打包常见痛点分析
插件开发中,打包环节往往成为影响效率的瓶颈。主要问题集中在四个方面:环境配置不一致导致的"在我电脑上能运行"现象、依赖项管理混乱引发的运行时错误、跨平台兼容性问题,以及手动操作带来的重复劳动和人为错误。这些问题不仅延长开发周期,还会降低用户体验和插件可靠性。
自动化打包的价值与目标
自动化打包通过标准化构建流程,能够显著提升开发效率、确保构建一致性、简化版本管理,并实现跨平台支持。一个完善的打包系统应该能够自动处理依赖还原、代码编译、产物清理、版本注入和发布包生成等全过程,让开发者专注于功能实现而非构建流程。
本文学习路径与收益
通过本文,你将系统掌握BepInEx插件打包的核心技术,包括环境标准化配置、自动化构建脚本编写、跨平台打包策略和CI/CD集成方案。完成学习后,你将能够构建一个可靠、高效的插件打包流水线,将发布准备时间从数小时缩短到几分钟。
核心原理:BepInEx打包机制深度解析
构建系统工作原理
BepInEx插件打包基于.NET构建系统,通过MSBuild项目文件定义构建流程。理解构建系统的工作原理,是实现高效打包的基础。构建过程主要包含三个阶段:首先是依赖解析,确定项目所需的所有库文件和工具;其次是编译过程,将源代码转换为可执行代码;最后是打包阶段,将编译产物组织成标准的BepInEx插件结构。
BepInEx插件目录结构规范
标准的BepInEx插件包遵循特定的目录结构,这是插件能够被正确加载的基础:
BepInEx/
├── core/ # 核心运行时组件
├── plugins/ # 插件存放目录
│ └── [插件名称]/ # 单个插件目录
│ ├── [插件DLL] # 插件主程序集
│ ├── config/ # 插件配置文件
│ └── assets/ # 插件资源文件
├── config/ # 全局配置文件
└── doorstop_libs/ # Doorstop加载器依赖
跨平台兼容性原理
BepInEx支持Windows、Linux等多个操作系统,其跨平台能力源于三个关键技术:.NET标准库提供的API抽象、条件编译实现的平台特定代码,以及运行时检测机制。打包过程中需要为不同平台生成相应的运行时配置,确保插件在目标环境中能够正确加载和执行。
常见问题速解
Q: 为什么我的插件在Windows上能运行但在Linux上失败?
A: 可能原因包括:使用了平台特定API而未进行条件编译、文件路径使用了Windows风格的反斜杠、缺少Linux特定的依赖库。解决方法是采用跨平台API、使用Path.Combine处理路径,并为不同平台配置特定的依赖项。
Q: 如何确定打包产物是否包含所有必要依赖?
A: 可使用dotnet list package命令检查项目依赖,并通过ildasm或dnSpy分析编译后的程序集依赖项。建议在干净环境中测试打包产物,以验证依赖完整性。
实施策略:BepInEx打包全流程实施指南
准备阶段:环境标准化配置
如何构建一致的开发环境,避免"在我电脑上能运行"的问题?环境标准化是可靠打包的基础,以下是详细实施步骤:
目标:配置标准化的BepInEx插件开发环境
操作:
-
安装必要工具:
# 安装.NET SDK 6.0 (跨平台命令) sudo apt-get install -y dotnet-sdk-6.0 # Linux choco install dotnet-sdk-6.0 # Windows (使用Chocolatey) # 安装CakeBuild工具 dotnet tool install -g Cake.Tool # 克隆BepInEx项目 git clone https://gitcode.com/GitHub_Trending/be/BepInEx cd BepInEx -
配置环境变量:
# Linux/MacOS (添加到~/.bashrc或~/.zshrc) echo 'export BEPINEX_VERSION="6.0.0"' >> ~/.bashrc echo 'export DOTNET_CLI_TELEMETRY_OPTOUT=1' >> ~/.bashrc source ~/.bashrc # Windows (PowerShell) [Environment]::SetEnvironmentVariable("BEPINEX_VERSION", "6.0.0", "User") [Environment]::SetEnvironmentVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1", "User")
验证:运行以下命令检查环境配置是否成功
dotnet --version # 应输出6.0.x
cake --version # 应输出1.3.0以上
echo $BEPINEX_VERSION # Linux/MacOS,应输出6.0.0
$env:BEPINEX_VERSION # Windows PowerShell,应输出6.0.0
成功标志:所有命令均输出预期版本号,无错误信息。
⚠️ 注意:确保系统路径中没有其他版本的.NET SDK或Cake工具,可能导致版本冲突。建议使用dotnet --list-sdks检查已安装的SDK版本。
实施阶段:自动化构建脚本开发
如何实现一键式打包,减少手动操作错误?开发自动化构建脚本是关键步骤:
目标:创建CakeBuild脚本实现全流程自动化打包
操作:
-
在项目根目录创建
build.cake文件,定义构建目标:// 功能:定义BepInEx插件打包流程 | 参数:无 var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release"); var version = EnvironmentVariable("BEPINEX_VERSION") ?? "6.0.0"; // 清理构建产物 Task("Clean") .Does(() => { CleanDirectory("./src/Plugin/bin"); CleanDirectory("./src/Plugin/obj"); CleanDirectory("./dist"); }); // 还原项目依赖 Task("Restore") .IsDependentOn("Clean") .Does(() => { DotNetRestore("./BepInEx.sln"); }); // 编译项目 Task("Build") .IsDependentOn("Restore") .Does(() => { DotNetBuild("./BepInEx.sln", new DotNetBuildSettings { Configuration = configuration, Version = version, ArgumentCustomization = args => args.Append("/p:GeneratePackageOnBuild=true") }); }); // 打包发布 Task("Package") .IsDependentOn("Build") .Does(() => { var outputDir = Directory("./src/Plugin/bin/" + configuration + "/netstandard2.0"); var distDir = Directory("./dist"); // 创建插件目录结构 CreateDirectory(distDir + "/BepInEx/plugins/MyPlugin"); // 复制插件文件 CopyFiles(outputDir + "/*.dll", distDir + "/BepInEx/plugins/MyPlugin"); CopyFiles("./src/Plugin/config/*", distDir + "/BepInEx/plugins/MyPlugin/config"); // 创建ZIP压缩包 Zip(distDir, "./BepInEx_Plugin_" + version + "_" + configuration + ".zip"); }); // 默认目标 Task("Default") .IsDependentOn("Package"); RunTarget(target); -
创建构建启动脚本:
# Linux/MacOS: 创建build.sh echo '#!/bin/bash' > build.sh echo 'dotnet cake build.cake "$@"' >> build.sh chmod +x build.sh # Windows: 创建build.ps1 echo 'dotnet cake build.cake $args' > build.ps1
验证:执行构建脚本并检查输出
# Linux/MacOS
./build.sh --target Package
# Windows
.\build.ps1 -target Package
成功标志:脚本执行完成后,在项目根目录生成以版本号命名的ZIP文件,包含完整的BepInEx插件结构。
验证阶段:打包产物测试与验证
如何确保打包的插件能够在目标环境正常工作?系统的测试验证流程必不可少:
目标:全面验证打包产物的完整性和功能性
操作:
-
创建测试环境:
# 创建测试目录 mkdir -p ./test-environment/BepInEx # 解压打包产物到测试目录 unzip ./BepInEx_Plugin_6.0.0_Release.zip -d ./test-environment # 复制测试配置文件 cp ./test/configs/* ./test-environment/BepInEx/config/ -
执行自动化测试:
# 运行插件加载测试 dotnet test ./tests/Plugin.Tests/ --logger "console;verbosity=detailed" -
手动测试步骤:
- 将测试环境复制到目标游戏目录
- 启动游戏并观察控制台输出
- 验证插件功能是否正常
- 检查配置文件是否正确生成
- 测试功能边界条件和错误处理
验证:检查测试结果
- 自动化测试:所有测试用例应通过(显示"Passed")
- 手动测试:游戏启动正常,插件功能符合预期,无错误日志
成功标志:自动化测试通过率100%,手动测试中插件功能正常,控制台无错误输出。
常见问题速解
Q: 构建脚本执行失败,提示缺少依赖项怎么办?
A: 首先运行dotnet restore手动检查依赖还原情况,查看是否有包无法下载。如遇网络问题,可配置NuGet镜像源:
dotnet nuget add source https://nuget.taobao.org/api/v2/ -n taobao
Q: 如何为不同平台生成特定版本的插件包?
A: 在Cake脚本中添加平台参数,使用条件编译和平台特定文件复制:
var platform = Argument("platform", "Windows");
Task("Package")
.Does(() => {
// 平台特定文件复制
if (platform == "Linux") {
CopyFiles("./src/Plugin/linux/*", distDir + "/BepInEx/plugins/MyPlugin");
} else {
CopyFiles("./src/Plugin/windows/*", distDir + "/BepInEx/plugins/MyPlugin");
}
});
然后使用./build.sh --target Package --platform Linux指定平台。
优化方案:提升打包效率与质量的高级策略
依赖管理优化技术
如何有效管理插件依赖,避免版本冲突和冗余?现代依赖管理策略可以显著提升打包质量:
依赖项分析与精简
项目依赖关系往往比想象的复杂,多余的依赖会增加插件体积并可能引发冲突。使用以下命令分析项目依赖:
# 列出项目直接依赖
dotnet list package
# 列出项目传递依赖树
dotnet list package --include-transitive
优化策略:
- 移除未使用的依赖项
- 使用
PrivateAssets="all"标记仅编译时依赖 - 对关键依赖项指定明确版本范围
- 定期更新依赖项到安全稳定版本
依赖项隔离与封装
为避免插件间的依赖冲突,可采用依赖隔离技术:
<!-- 在.csproj文件中配置依赖隔离 -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
<ItemGroup>
<!-- 仅编译时依赖,不随插件发布 -->
<PackageReference Include="Newtonsoft.Json" Version="13.0.1">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<!-- 运行时依赖,随插件发布 -->
<PackageReference Include="0Harmony" Version="2.2.2">
<PrivateAssets>none</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
构建性能优化方案
如何加速构建过程,减少等待时间?构建性能优化可以显著提升开发效率:
增量构建配置
通过合理配置项目文件,实现增量构建,只重新编译变更的代码:
<!-- 在.csproj文件中优化构建配置 -->
<PropertyGroup>
<!-- 启用增量构建 -->
<IncrementalBuild>true</IncrementalBuild>
<!-- 减少不必要的文件复制 -->
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
<!-- 并行构建 -->
<MaxCpuCount>0</MaxCpuCount>
</PropertyGroup>
构建缓存策略
使用构建缓存可以大幅减少重复构建时间:
# 使用dotnet build-server管理构建服务器
dotnet build-server start # 启动构建服务器
dotnet build-server shutdown # 关闭构建服务器
# 配置NuGet缓存位置
dotnet nuget locals all --list # 查看当前缓存位置
dotnet nuget locals all --clear # 清理缓存(必要时)
版本管理与发布策略
如何建立清晰的版本管理体系,确保发布质量?规范的版本管理是项目成熟的标志:
语义化版本控制
采用语义化版本(Semantic Versioning)规范:主版本.次版本.补丁版本(如1.2.3):
- 主版本:不兼容的API变更
- 次版本:向后兼容的功能新增
- 补丁版本:向后兼容的问题修复
在Cake脚本中集成版本管理:
// 从Git标签获取版本号
var gitVersion = GitVersioning.GetVersion();
var version = gitVersion.Major + "." + gitVersion.Minor + "." + gitVersion.Patch;
// 版本号注入
Task("SetVersion")
.Does(() => {
XmlPoke("./src/Plugin/Plugin.csproj",
"/Project/PropertyGroup/Version",
version);
});
发布渠道管理
建立多渠道发布策略,区分测试版和稳定版:
// 渠道特定打包
Task("Package-Test")
.IsDependentOn("Build")
.Does(() => {
Zip(distDir, "./BepInEx_Plugin_" + version + "_Test.zip");
});
Task("Package-Stable")
.IsDependentOn("Build")
.Does(() => {
// 稳定版额外添加签名和文档
SignFile(distDir + "/BepInEx/plugins/MyPlugin/MyPlugin.dll");
CopyFile("./docs/USER_MANUAL.md", distDir + "/README.md");
Zip(distDir, "./BepInEx_Plugin_" + version + "_Stable.zip");
});
常见问题速解
Q: 如何处理不同版本BepInEx核心库的兼容性问题?
A: 采用条件编译和适配层设计:
#if BEPINEX_5
using BepInEx.Logging;
#elif BEPINEX_6
using BepInEx.Logging.Internal;
#endif
// 适配层
public static class LoggerAdapter
{
#if BEPINEX_5
public static void LogInfo(object data) => Logger.Log(LogLevel.Info, data);
#elif BEPINEX_6
public static void LogInfo(object data) => Logger.Instance.LogInfo(data);
#endif
}
在.csproj中配置条件编译符号:
<PropertyGroup Condition=" '$(BepInExVersion)' == '5' ">
<DefineConstants>BEPINEX_5</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(BepInExVersion)' == '6' ">
<DefineConstants>BEPINEX_6</DefineConstants>
</PropertyGroup>
Q: 构建缓存导致旧代码被错误打包怎么办?
A: 执行清理构建并重置缓存:
# 清理构建产物和缓存
./build.sh --target Clean
dotnet nuget locals all --clear
# 重新构建
./build.sh --target Package
实战案例:BepInEx插件打包完整案例分析
成功案例:高效自动化打包流水线
以下是一个企业级BepInEx插件项目的打包流水线实现,实现了从代码提交到多平台发布包生成的全自动化:
项目结构
MyBepInExPlugin/
├── src/
│ └── MyPlugin/
│ ├── MyPlugin.csproj
│ ├── Plugin.cs
│ └── config/
├── tests/
│ └── MyPlugin.Tests/
├── build.cake
├── build.sh
├── build.ps1
└── .github/workflows/build.yml
核心构建脚本(build.cake)
// 功能:企业级BepInEx插件打包脚本 | 参数:target, configuration, version, platform
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
var version = Argument("version", EnvironmentVariable("BEPINEX_VERSION") ?? "1.0.0");
var platform = Argument("platform", "Windows");
// 定义路径
var solutionPath = "./MyPlugin.sln";
var projectPath = "./src/MyPlugin/MyPlugin.csproj";
var outputDir = Directory($"./src/MyPlugin/bin/{configuration}/netstandard2.0");
var distDir = Directory($"./dist/{platform}");
// 清理任务
Task("Clean")
.Does(() => {
CleanDirectory(outputDir);
CleanDirectory(distDir);
});
// 还原依赖
Task("Restore")
.IsDependentOn("Clean")
.Does(() => {
DotNetRestore(solutionPath);
});
// 运行单元测试
Task("Test")
.IsDependentOn("Restore")
.Does(() => {
DotNetTest(solutionPath, new DotNetTestSettings {
Configuration = configuration,
NoBuild = true,
Logger = "trx"
});
});
// 编译项目
Task("Build")
.IsDependentOn("Test")
.Does(() => {
var buildSettings = new DotNetBuildSettings {
Configuration = configuration,
Version = version,
DefineConstants = new [] { $"PLATFORM_{platform.ToUpper()}" },
OutputDirectory = outputDir
};
DotNetBuild(projectPath, buildSettings);
});
// 打包插件
Task("Package")
.IsDependentOn("Build")
.Does(() => {
// 创建标准BepInEx目录结构
CreateDirectory(distDir + "/BepInEx/plugins/MyPlugin");
CreateDirectory(distDir + "/BepInEx/config");
// 复制插件文件
CopyFiles(outputDir + "/*.dll", distDir + "/BepInEx/plugins/MyPlugin");
CopyFiles(outputDir + "/*.pdb", distDir + "/BepInEx/plugins/MyPlugin");
CopyFiles("./src/MyPlugin/config/*", distDir + "/BepInEx/config");
// 平台特定文件
if (platform == "Linux") {
CopyFiles("./src/MyPlugin/platform/linux/*", distDir + "/BepInEx/plugins/MyPlugin");
} else {
CopyFiles("./src/MyPlugin/platform/windows/*", distDir + "/BepInEx/plugins/MyPlugin");
}
// 创建压缩包
var zipName = $"MyPlugin_{version}_{configuration}_{platform}.zip";
Zip(distDir, zipName);
// 生成校验和
var checksum = CalculateFileHash(zipName, HashAlgorithmName.SHA256);
FileWriteText($"{zipName}.sha256", checksum);
});
// CI发布任务
Task("Publish")
.IsDependentOn("Package")
.Does(() => {
// 这里可以添加发布到Nexus、GitHub Releases等代码
Information("Package ready for release: " + GetFiles("*.zip").First().FullPath);
});
// 默认任务
Task("Default")
.IsDependentOn("Package");
RunTarget(target);
CI/CD集成(.github/workflows/build.yml)
name: MyPlugin CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
platform: [Linux, Windows]
include:
- os: ubuntu-latest
platform: Linux
- os: windows-latest
platform: Windows
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Install Cake
run: dotnet tool install -g Cake.Tool
- name: Build and package
run: |
if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
.\build.ps1 --target Publish --platform ${{ matrix.platform }} --version 1.0.${{ github.run_number }}
else
./build.sh --target Publish --platform ${{ matrix.platform }} --version 1.0.${{ github.run_number }}
fi
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: MyPlugin-${{ matrix.platform }}
path: ./*.zip*
成功关键因素
- 分层任务设计:将构建过程分解为独立任务,提高复用性和维护性
- 多平台并行构建:通过CI矩阵同时构建Windows和Linux版本
- 自动化测试集成:构建前运行单元测试,确保代码质量
- 版本自动递增:使用CI构建号自动生成修订版本号
- 校验和生成:为发布包生成SHA256校验和,确保完整性
失败案例分析与解决方案
案例:依赖冲突导致插件加载失败
问题描述:某插件在开发环境正常工作,但打包后在用户环境加载失败,日志显示"无法加载文件或程序集Newtonsoft.Json"。
问题分析:通过dotnet list package发现项目和BepInEx核心都依赖Newtonsoft.Json,但版本不同,导致运行时冲突。
解决方案:实施依赖隔离和绑定重定向
- 修改项目文件,隔离依赖:
<PackageReference Include="Newtonsoft.Json" Version="13.0.1">
<PrivateAssets>all</PrivateAssets>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
- 添加绑定重定向配置文件(App.config):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
- 在Cake脚本中添加配置文件复制:
// 在Package任务中添加
CopyFile("./src/MyPlugin/App.config", distDir + "/BepInEx/plugins/MyPlugin/MyPlugin.dll.config");
案例:跨平台路径问题导致配置文件加载失败
问题描述:插件在Windows上能正常读取配置文件,但在Linux上提示"找不到配置文件"。
问题分析:代码中使用了Windows风格的路径分隔符(\),在Linux系统上无法正确解析路径。
解决方案:使用跨平台路径处理API
// 错误代码
var configPath = Path.Combine("BepInEx", "config", "MyPlugin" + "\\" + "config.json");
// 正确代码
var configPath = Path.Combine("BepInEx", "config", "MyPlugin", "config.json");
// 加载配置文件的跨平台实现
public static string LoadConfig()
{
var configDir = Path.Combine(Paths.ConfigPath, "MyPlugin");
var configFile = Path.Combine(configDir, "config.json");
// 确保目录存在
Directory.CreateDirectory(configDir);
// 读取或创建配置文件
if (File.Exists(configFile))
{
return File.ReadAllText(configFile);
}
else
{
var defaultConfig = JsonConvert.SerializeObject(new Config(), Formatting.Indented);
File.WriteAllText(configFile, defaultConfig);
return defaultConfig;
}
}
常见问题速解
Q: CI构建成功但本地构建失败,如何解决?
A: 主要原因是环境差异,解决方法包括:
- 使用Docker容器标准化本地构建环境
- 在CI配置中导出环境信息(
dotnet --info、env) - 本地重现CI环境变量:
export CI=true; export BEPINEX_VERSION=1.0.0 - 比较CI和本地的构建日志,定位差异点
Q: 如何处理大型资源文件的打包?
A: 对于超过100MB的资源文件,建议:
- 使用Git LFS管理大型二进制文件
- 在构建脚本中添加资源下载步骤,从专用服务器获取
- 采用增量打包策略,只包含变更的资源文件
- 考虑使用压缩算法(如LZ4)减小资源体积
扩展阅读
推荐技术资源
-
BepInEx官方文档:提供核心概念和API参考,是深入理解BepInEx框架的基础资源。
-
CakeBuild官方指南:详细介绍Cake构建脚本的高级特性和最佳实践,帮助开发复杂构建流程。
-
.NET依赖项管理最佳实践:微软官方文档,深入讲解.NET项目的依赖解析机制和版本控制策略。
进阶学习路径
-
构建系统深度定制:学习MSBuild项目文件的高级配置,实现更精细的构建控制。
-
自动化测试框架:集成xUnit或NUnit测试框架,实现插件功能的自动化验证。
-
容器化构建环境:使用Docker创建一致的跨平台构建环境,消除"在我电脑上能运行"的问题。
附录:BepInEx打包常用命令速查表
环境配置命令
| 命令 | 作用 | 适用场景 |
|---|---|---|
dotnet --version |
检查.NET SDK版本 | 环境验证 |
dotnet tool install -g Cake.Tool |
安装CakeBuild工具 | 首次环境 setup |
git clone https://gitcode.com/GitHub_Trending/be/BepInEx |
获取BepInEx源码 | 源码构建场景 |
export BEPINEX_VERSION=6.0.0 |
设置版本环境变量 | 版本管理 |
构建操作命令
| 命令 | 作用 | 适用场景 |
|---|---|---|
dotnet restore |
还原项目依赖 | 首次构建或依赖变更 |
dotnet build -c Release |
发布模式编译 | 正式版本构建 |
dotnet test |
运行单元测试 | 代码质量验证 |
./build.sh --target Package |
执行Cake打包任务 | Linux/MacOS打包 |
.\build.ps1 -target Package |
执行Cake打包任务 | Windows打包 |
打包验证命令
| 命令 | 作用 | 适用场景 |
|---|---|---|
unzip -l BepInEx_Plugin_6.0.0.zip |
查看压缩包内容 | 打包结果检查 |
sha256sum BepInEx_Plugin_6.0.0.zip |
计算文件校验和 | 文件完整性验证 |
dotnet list package |
查看项目依赖 | 依赖冲突排查 |
ildasm MyPlugin.dll |
反编译程序集 | 编译结果分析 |
跨平台命令对比
| 操作 | Windows命令 | Linux/MacOS命令 |
|---|---|---|
| 清理构建 | dotnet clean |
dotnet clean |
| 运行构建脚本 | .\build.ps1 |
./build.sh |
| 创建目录 | mkdir dist |
mkdir -p dist |
| 复制文件 | copy *.dll dist |
cp *.dll dist/ |
| 压缩文件 | 7z a output.zip ./BepInEx |
zip -r output.zip ./BepInEx |
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust098- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00