dotnet-exec 0.11.0 released

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dotnet-exec 0.11.0 released相关的知识,希望对你有一定的参考价值。

dotnet-exec 0.11.0 released

Intro

dotnet-exec 是一个 C# 程序的小工具,可以用来运行一些简单的 C# 程序而无需创建项目文件,让 C# 像 python/nodejs 一样简单,而且可以自定义项目的入口方法,支持但不限于 Main 方法。

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 即可看到一些使用说明

Features

Static using && using alias

在之前版本中对于 script,我们是不支持 static using 和 using alias 的,只支持 code 中使用,在 0.10.0 版本中我们支持了在 script 中使用 static using 和 using 的别名了

举个栗子

dotnet-exec 'MyConsole.WriteLine(PI)' --using 'MyConsole=System.Console' --using static 'System.Math'

实现原理其实也比较简单,script 默认的 import 选项只能引入普通的命名空间,于是我们曲线救国,把 using 作为代码先执行了一下,之后再执行我们的 script 代码,在同一个上下文中会记住之前的 using 信息

具体实现代码可以参考:https://github.com/WeihanLi/dotnet-exec/blob/2b2d2d4d47da5561001fb9f172bea65a8daa0932/src/dotnet-exec/CSharpScriptingExecutor.cs#L50-L52

Execute without SDK

在之前的版本中我们进行编译的时候始终会选择去使用引用程序集进行编译,在没有 SDK 的环境里会尝试从 nuget 上下载引用程序集进行编译

在 0.10.0 版本中,我们默认会使用 runtime 的程序集进行编译,这样即使没有网络,没有 SDK,只有 runtime 依然是可以工作的,当然你仍然可以使用 --ref-compile 选项来指定始终使用引用程序集来编译

Execute without web

在之前的版本中我们的 docker 镜像使用的是 aspnet  的镜像,考虑很多场景可能用不到 web 框架,所以从 0.11.0 版本开始默认不会再引用 web 框架引用,当然你也可以使用 -w/--web 来显式添加 web 框架引用

对于 docker 镜像,新的 latest tag 的镜像的基础镜像换成了 runtime,另外单独提供了一个 web tag 的镜像基础镜像是 aspnet,这样我们的镜像就能小很多了

但是即使你使用的是 latest 指定了使用 web 框架引用那你仍然可以运行,只是本地没有 aspnet runtime 的时候会尝试从 nuget 下载,而 web 则内置了 runtime 不需要再去下载,来个例子

首先我们可以来看一下最新的 docker 镜像中只有一个 .NET Core runtime 的信息,没有 aspnet 的 runtime 了

我们用这个镜像来跑一个 web api 项目

docker run --rm --pull=always weihanli/dotnet-exec:latest dotnet-exec 'WebApplication.Create().Run();' --web

从上面的截图可以看到我们的 webapi 已经跑起来了,我们可以进一步使用暴露一个端口,请求一下我们的 API 试一下,让我们稍加改造

docker run --rm --pull=always -p 5000:80 weihanli/dotnet-exec:latest dotnet-exec 'WebApplication.Create().Chain(_ => _.MapRuntimeInfo()).Run();' --web --reference "nuget:WeihanLi.Web.Extensions" --using 'WeihanLi.Web.Extensions'

这里引用了一个我自己封装的一个扩展,会注册一个 runtime-info 的 endpoint,我这里使用的是 Github 的 CodeSpaces,会自动暴露一个 endpoint 来访问我们的服务,我们可以访问我们的 runtime-info endpoint 会看到一个类似下面的 response

我们也可以使用 curl 或者可以使用 dotnet-httpie 来访问这个 endpoint

dotnet-http :5000/runtime-info

ProjectReference

在 0.11.0 版本中我们增加项目引用的支持,实现原理是尝试 build 项目,引用 build 之后的 dll

使用方式如下:

dotnet-exec 'ApplicationHelper.GetLibraryInfo(typeof(CsvHelper))' --reference 'project:C:\\projects\\sources\\WeihanLi.Npoi\\src\\WeihanLi.Npoi\\WeihanLi.Npoi.csproj' --using 'WeihanLi.Npoi'

和引用 nuget 的效果基本一致

ApplicationHelper.GetLibraryInfo 是从 assembly 信息中获取信息封装的一个方法,可以参考:https://github.com/WeihanLi/WeihanLi.Common/blob/d2db73a0e02cef009dc61190a41263ad6cb2b6bc/src/WeihanLi.Common/Helpers/ApplicationHelper.cs#L28

More

原来引用本地的 dll 需要指定一个绝对路径(full path),在 0.11.0 版本中我们支持了相对路径,使用起来也是更加的简单,新增加的项目引用也是支持相对路径的

上面的更新包含了 0.10.0 版本和 0.11.0 版本,具体更新可以参考 Github,代码变更可以参考:https://github.com/WeihanLi/dotnet-exec/compare/0.9.0...0.11.0

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.9.0...0.11.0

  • https://github.com/WeihanLi/WeihanLi.Common/blob/d2db73a0e02cef009dc61190a41263ad6cb2b6bc/src/WeihanLi.Common/Helpers/ApplicationHelper.cs#L28

以上是关于dotnet-exec 0.11.0 released的主要内容,如果未能解决你的问题,请参考以下文章

dotnet-exec 小工具

dotnet-exec 0.8.0 released

dotnet-exec 0.4.0 released

富设备标准平台:基于RK3568的DAYU200进入OpenHarmony 3.1 Relea

maven打包异常-Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.1.RELEAS

maven打包异常-Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.1.RELEAS