将 YAML 文件转 C# 代码(字典)。
本仓库提供三个 NuGet 包:
包 | NuGet | 作用 |
---|---|---|
dotnetCampus.YamlToCSharp | 依赖库1 | |
dotnetCampus.YamlToCSharp.Source | 源代码包2 | |
dotnetCampus.YamlToCSharp.Build | 编译依赖3 |
安装 dotnetCampus.YamlToCSharp 到你的项目中,即可使用 YAML 转 C# 相关的辅助类。
典型的用法是生成语言项,你可以阅读下面的博客:
安装 dotnetCampus.YamlToCSharp.Build 到你的项目中,即可使用已经自动编译好的 YAML 转 C# 的类:
假设你的项目中存在 Localizations 文件夹,其中的文件结构如下:
- /Localizations
- en-US
- Extension.yaml
- Main.yml
- zh-CN
- Extension.yaml
- Main.yml
- zh-TW
- Extension.yaml
- Main.yml
那么你可以在代码中编写如下 C# 代码来使用这些 YAML 文件中的内容,视为字典:
var languages = new Dictionary<string, IYamlCSharpDictionary[]>
{
{
"en-US", new IYamlCSharpDictionary[]
{
new dotnetCampus.YamlToCSharp.Localizations.en_US.Main(),
new dotnetCampus.YamlToCSharp.Localizations.en_US.Extension(),
}
},
{
"zh-CN", new IYamlCSharpDictionary[]
{
new dotnetCampus.YamlToCSharp.Localizations.zh_CN.Main(),
new dotnetCampus.YamlToCSharp.Localizations.zh_CN.Extension(),
}
},
{
"zh-TW", new IYamlCSharpDictionary[]
{
new dotnetCampus.YamlToCSharp.Localizations.zh_TW.Main(),
new dotnetCampus.YamlToCSharp.Localizations.zh_TW.Extension(),
}
},
};
var dict = languages["zh-CN"].SelectMany(x => x.AsDictionary());
默认情况下,会将你项目中所有的 *.yml
文件和 *.yaml
文件加入编译,就像写了下面代码一样:
<ItemGroup>
<YamlToCSharpCompile Include="**\*.yml;**\*.yaml" Exclude="obj\**\*.yml;obj\**\*.yaml;bin\**\*.yml;bin\**\*.yaml" />
</ItemGroup>
默认情况下,通过 YAML 生成的 C# 文件的命名空间就是在 YAML 文件夹中创建一个 C# 代码时的命名空间一样;而生成的类名就是文件名进行标识符处理后的名字。但,你也可以改变这一行为。
有两种方法来更改生成类的命名空间:
- 使用特殊名称的文件夹来限定命名空间;
- 在
YamlToCSharpCompile
中设置额外的属性(暂未实现)。
特殊命名的文件夹有:bin
、obj
、debug
、release
、x86
、x64
、net48
(和其他 .NET Framework 框架版本)、netcoreapp3.1
(和其他 .NET Core 框架版本);以及所有以点(.
)开头的文件夹(如 .vs
),所有以下画线(_
)开头或结尾的文件夹(例如 _test
、test_
)。
设置额外的属性如下:
<ItemGroup>
<YamlToCSharpCompile Update="Loc\a.yml" Namespace="dotnetCampus.Demo" ClassName="Foo" />
</ItemGroup>
Namespace
设置生成的类型的命名空间,ClassName
设置生成的类型的类名。不设置则继续保持默认值。假设项目的默认命名空间为 dotnetCampus.YamlToCSharp
,那么在以上示例代码编写前,生成的类是 dotnetCampus.YamlToCSharp.Loc.a
,在编写后生成的类是 dotnetCampus.Demo.Foo
。
安装 dotnetCampus.YamlToCSharp.Build 到你的项目中之后,你可以扩展 YAML 到 C# 的转换过程:
<!-- 在 YAML 向 C# 编译之前,做些什么。这个时机可以改变要编译的 YAML 文件 -->
<Target Name="CustomTarget"
BeforeTargets="YamlToCSharpCoreCompile">
<ItemGroup>
<!-- 将收集到的要编译的 YAML 文件存到 CollectedYamlToCSharpCompile 集合中。 -->
<CollectedYamlToCSharpCompile Include="@(YamlToCSharpCompile)" />
<!-- 清空默认引入的全部要编译的 YAML 文件。 -->
<YamlToCSharpCompile Remove="**\*.yml;**\*.yaml" />
</ItemGroup>
</Target>
<!-- 在 YAML 向 C# 编译之后,做些什么。这个时机可以拿到所有已编译好的 C# 文件。 -->
<Target Name="CustomTarget"
AfterTargets="YamlToCSharpCoreCompile">
<ItemGroup>
<!-- 已从 YAML 编译好的 C# 文件。 -->
<CollectedYamlToCSharpCompile Include="@(YamlCompiledCSharp)" />
</ItemGroup>
</Target>
当项目出现编译错误,并提示你报告问题时,建议在这里报告问题
- 编译 dotnetCampus.YamlToCSharp.Sample.Wpf 项目,可以模拟 dotnetCampus.YamlToCSharp.Build 包在目标项目中编译时的效果。