dotnet 10 run file 支持多文件的一种方式
Intro
目前 dotnet run file 还没有官方支持多文件,不过因为会遵循 build file,会使用常用的 build 文件如:
Directory.Build.props/Directory.Build.target/Directory.Build.rsp/Directory.Packages.props
所以我们可以利用这一点来自己实现一个多文件的支持,官方的支持要等到 .NET 11 来支持了,如果你真的确实有这样的需求不妨尝试一下
Implement
我们现在可以在单文件里指定 build property,不能指定 item,所以我们可以在 property 里指定要依赖的文件,然后通过自定义 build 逻辑来将属性里 import 的文件路径来转换成编译项 <Compile Include="$(Import)" />
我们新建一个 Directory.Build.targets 来支持将属性转换成编译项来共同编译,示例如下:
<Project>
<ItemGroup Condition="'$(Imports)' != ''">
<_ImportedFiles Include="$(Imports.Split(';'))" />
<Compile Include="@(_ImportedFiles)" />
</ItemGroup>
</Project>
我们这里通过 Imports 属性转换成 Compile 编译项,在单文件 C# 文件(multi-file-test.cs)内容如下:
#:property Imports=TestHelper.cs
using static Test.TestHelper;
PrintMessage("Hello from multi-file test!");
这一文件依赖了同目录下另外一个 C# 文件 TestHelper.cs 定义了一个 TestHelper 类型,类型里定义了一个 PrintMessage 方法,文件内容如下:
namespace Test;
public static class TestHelper
{
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
}
此时我们来执行下 dotnet multi-file-test.cs 来测试一下
可以看到成功编译并且成功打印出了信息
那会不会影响其他的文件呢,其实没影响的,因为其他文件没有设置 Imports 也不会新增编译项,比如说我们同一目录下还有一个之前测试的 hello.cs, 文件内容如下:
#!/usr/bin/env dotnet
Console.WriteLine("Hello .NET 10!");
我们执行下 dotnet hello.cs 可以看到不会有什么影响的
有需要的朋友可以自己尝试一下哈
References
-
• https://github.com/WeihanLi/SamplesInPractice/tree/main/net10sample/file-programs

