跳转到内容

环境搭建

按照以下步骤初始化你的插件项目。

  1. 准备开发环境

    • IDE: Visual Studio 2026
    • SDK: .NET 10 SDK
    • 宿主源码: 本地需要有 BetterLyrics 解决方案,以便引用 CoreDevTools
  2. 创建项目

    创建一个新的 类库(Class Library) 项目,建议以 BetterLyrics.Plugins.PluginType.YourPluginName 命名,以保持命名一致性。

    • 目标框架: .NET 10net10.0-windows10.0.26100.0
    • PluginType 可以是 SourceTranslatorTransliteratorAI 等,具体取决于你的插件类型和功能定位。
  3. 配置 .csproj

    将你的 .csproj 内容替换为下方的模板。此模板连接了整个自动化工具链。

    BetterLyrics.Plugins.PluginType.YourPluginName.csproj
    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <SupportedOSPlatformVersion>10.0.19041.0</SupportedOSPlatformVersion>
    <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
    <EnableDynamicLoading>true</EnableDynamicLoading>
    <Description>[TODO]插件描述</Description>
    <Version>[TODO]插件版本号</Version>
    <Authors>[TODO]插件作者</Authors>
    <RepositoryUrl>[TODO]插件 GitHub 仓库地址</RepositoryUrl>
    <Copyright>[TODO]插件版权信息</Copyright>
    <Company>$(Authors)</Company>
    </PropertyGroup>
    <ItemGroup>
    <ProjectReference Include="..\..\BetterLyrics.Core\BetterLyrics.Core.csproj" >
    <Private>false</Private>
    <ExcludeAssets>runtime</ExcludeAssets>
    </ProjectReference>
    </ItemGroup>
    <Target Name="AutoExcludeSharedAssemblies" AfterTargets="ResolveAssemblyReferences">
    <PropertyGroup>
    <HostOutputDir>..\..\BetterLyrics.WinUI3\bin\x64\$(Configuration)\$(TargetFramework)\</HostOutputDir>
    </PropertyGroup>
    <Message Text="[Debug] Searching for Host Assemblies in: $(HostOutputDir)" Importance="High" />
    <ItemGroup>
    <FilesToCopy Include="@(ReferenceCopyLocalPaths)" />
    <SharedFiles Include="@(FilesToCopy)" Condition="Exists('$(HostOutputDir)%(Filename)%(Extension)')" />
    <ReferenceCopyLocalPaths Remove="@(SharedFiles)" />
    </ItemGroup>
    <Message Text="[Smart Trim] Excluded shared assemblies:%0a@(SharedFiles->' -&gt; %(Filename)%(Extension)', '%0a')" Importance="High" Condition="'@(SharedFiles)' != ''" />
    </Target>
    <Target Name="RunDevTools" AfterTargets="PostBuildEvent">
    <PropertyGroup>
    <AnalyzerPath>..\..\BetterLyrics.DevTools\bin\$(Configuration)\$(TargetFramework)\BetterLyrics.DevTools.exe</AnalyzerPath>
    <MainAppConfigDir>..\..\BetterLyrics.WinUI3\PluginConfigs\</MainAppConfigDir>
    <SourceLangDir>$(ProjectDir)Langs\</SourceLangDir>
    <OutputLangDir>$(TargetDir)Langs\</OutputLangDir>
    </PropertyGroup>
    <Message Text="[Analyzer] Generating resources to Project Directory..." Importance="High" />
    <Exec Command="&quot;$(AnalyzerPath)&quot; &quot;$(TargetPath)&quot; All &quot;$(ProjectDir)\&quot;" />
    <ItemGroup>
    <FreshLangFiles Include="$(SourceLangDir)*.json" />
    </ItemGroup>
    <Copy SourceFiles="@(FreshLangFiles)" DestinationFolder="$(OutputLangDir)" />
    <Copy SourceFiles="$(TargetDir)$(ProjectName)_TrimmingConfig.cs" DestinationFolder="$(MainAppConfigDir)" SkipUnchangedFiles="true" />
    <Copy SourceFiles="$(TargetDir)$(ProjectName)_TrimmerRoots.xml" DestinationFolder="$(MainAppConfigDir)" SkipUnchangedFiles="true" />
    </Target>
    <Target Name="PackagePluginToZip" AfterTargets="Build">
    <PropertyGroup>
    <PackageOutputDir>$(ProjectDir)..\_Dist\$(Configuration)\</PackageOutputDir>
    <ZipFileName>$(AssemblyName).v$(Version).blp</ZipFileName>
    <FinalZipPath>$(PackageOutputDir)$(ZipFileName)</FinalZipPath>
    <StagingDir>$(OutputPath)_TempStaging\</StagingDir>
    </PropertyGroup>
    <ItemGroup>
    <FilesToPack Include="$(OutputPath)**\*" />
    <FilesToPack Remove="$(OutputPath)$(ProjectName)_TrimmingConfig.cs" />
    <FilesToPack Remove="$(OutputPath)$(ProjectName)_TrimmerRoots.xml" />
    <FilesToPack Remove="$(StagingDir)**\*" />
    </ItemGroup>
    <RemoveDir Directories="$(StagingDir)" />
    <Copy SourceFiles="@(FilesToPack)" DestinationFolder="$(StagingDir)%(RecursiveDir)" />
    <ZipDirectory SourceDirectory="$(StagingDir)" DestinationFile="$(FinalZipPath)" Overwrite="true" />
    <RemoveDir Directories="$(StagingDir)" />
    <Message Text="[Packager] The plugin package has been generated in the parent directory: $(FinalZipPath)" Importance="High" />
    </Target>
    </Project>

成功编译一次后,你的项目结构应该如下所示:

  • 文件夹BetterLyrics/
    • 文件夹BetterLyrics.WinUI3/
      • 文件夹PluginConfigs/
        • BetterLyrics.Plugins.PluginType.YourPluginName_TrimmerRoots.xml
        • BetterLyrics.Plugins.PluginType.YourPluginName_TrimmingConfig.cs
    • 文件夹Plugins/
      • 文件夹_Dist/
        • 文件夹$(Configuration)/
          • BetterLyrics.Plugins.PluginType.YourPluginName.vVersion.blp
      • 文件夹BetterLyrics.Plugins.PluginType.YourPluginName/
        • 文件夹Langs/
          • en.json
        • Config.cs
        • Plugin.cs
        • BetterLyrics.Plugins.PluginType.YourPluginName.csproj