dotnet-exec 0.16.0 Released
Intro
dotnet-exec
是一个 dotnet tool 一个命令行小工具,可以帮助我们方便地执行 C# 代码,可以用来运行一些简单的 C# 程序而无需创建项目文件,让 C# 像 python/nodejs 一样简单,而且可以自定义项目的入口方法,支持但不限于 Main 方法。
0.16.0 版本是 2024 年的第一个新版本,也是支持自定义 nuget 源的第一个版本,还有哪些更新我们一起来看下吧
Install/Update
dotnet-exec
是一个 dotnet tool,可以使用安装 dotnet tool 的命令来安装
安装/更新最新稳定版本:
dotnet tool update -g dotnet-execute
安装最新的 preview 版本:
dotnet tool update -g dotnet-execute --prerelease
执行 dotnet-exec -h
或者 dotnet-exec --help
即可看到一些使用说明
也可以通过 docker/podman 来在不安装 dotnet sdk 的情况下体验,例如:
docker run --rm --pull=always weihanli/dotnet-exec:latest dotnet-exec "ApplicationHelper.RuntimeInfo"
New features
NuGet Config support
在之前的版本中,我们只支持 nuget.org 上的 nuget package,在这一版本中我们会根据 nuget 的配置来查找 nuget source,而不再是只用 nuget.org 了
这样我们如果需要用到一些不在 nuget.org 中 publish 的一些 package 也变得可能,也可以支持私有的 nuget 源了
默认我们会从当前目录找 nuget.config,我们也可以通过 --nuget-config
来手动指定一个特殊位置的一个 nuget.config
大家可以自己尝试一下
dry-run option
新版本中支持了 --dry-run
,可以使用这一选项来快速测试脚本编译是否有编译问题,只编译不执行
我们再加一个 using
可以看到编译结束之后就完成了,并没有执行,如果没有 --dry-run
这个 option 就会执行我们的代码
--dry-run
env option
在之前的版本中其实我们已经可以支持通过 directive 的方法指定环境变量,比如
dotnet-exec [env:name=test] '$"Hello {Environment.GetEnvironmentVariable("name")}".Dump();'
但是有些朋友用起来会觉得有些不习惯不方便,所以我们新增加一个 --env
option,我们就可以像其他参数一样进行设置
dotnet-exec '$"Hello {Environment.GetEnvironmentVariable("name")}".Dump();' --env name=test
--env
option
--
command arguments
在之前的版本中,我们可以通过 --args
option 来设置 script 里的命令行参数 args
,但是我们使用的时候有点不便,比如:--args "--target hello"
多个参数的时候必须要写在一个参数里,所以我们参考别的项目引入了 --
,在 --
后面的参数都认为是命令行参数
前面的命令就可以变成为 -- --target hello
More
在之前的版本中在 Linux 平台上 config profile 的目录会和 dotnet tool 发生冲突,这一版本修改了 config profile 目录来避免这一问题
如果你有较多的 profile 配置需要迁移可以将 %USERPROFILE%/.dotnet/tools
目录下的 dotnet-exec
目录移动到 .config
目录下(如果没有需要手动新建一个),最后通过 dotnet-exec profile ls
来验证是否迁移成功
之前的版本可能会因为 reference 引用的格式不同导致重复添加引用,这一版本中做了一些优化,会先做引用格式做统一处理,之后再添加引用从而比较重复引用,比如说:
var code = """
// r: nuget:WeihanLi.Common,1.0.60
// r: nuget: WeihanLi.Common,1.0.60
// r: nuget: WeihanLi.Common, 1.0.60
// r: "nuget: WeihanLi.Common, 1.0.60"
Console.WriteLine("Hello World!");
""";
var options = new ExecOptions()
{
Script = code,
DryRun = true,
};
await _handler.Execute(options);
Assert.Single(options.References);
这些 reference 的不同格式最终生效的只有一个因为我们引用是相同的
最后之前我们利用 cake 来实现 CI 过程的处理,在这个版本中我们使用 C# 代码 + dotnet-exec 来取代了 cake,也在其他项目上做了一些尝试,这样的好处在于可以使用自己熟悉的语言和 API 来自定义处理,后面再具体分享示例
References
https://github.com/WeihanLi/dotnet-exec
https://www.nuget.org/packages/dotnet-execute/
https://hub.docker.com/r/weihanli/dotnet-exec
https://github.com/WeihanLi/dotnet-exec/compare/0.15.0...0.16.0