.NET Core 跨平台执行命令、脚本
思路解析
默认情况下,生成项目时会把Views的视图文件编译成dll*.Views.dll
同时我们也看不到Views文件夹,如果有频繁修改视图内容的需求,这样就很不方便
我们可以将视图预编译改为运行时编译
1、添加Nuget:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.9" />
2、在项目文件的节点下添加:
<RazorCompileOnPublish>false</RazorCompileOnPublish>
3、在AddControllersWithViews()方法后添加AddRazorRuntimeCompilation()
services.AddControllersWithViews()
.AddRazorRuntimeCompilation();
4、重新发布项目,发布后就可以看到多了Views文件夹,同时*.Views.dll没了
dotNET 6代码片断:
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<StartupObject>ZoomLaCMS.Program</StartupObject>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
<RazorCompileOnBuild>False</RazorCompileOnBuild>
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
quot;Exited Code : {proc.ExitCode}");
}
}
执行结果如下:
从执行结果可以看出,我们通过编写的程序来执行dotnet --info
命令获取的结果几乎一样,只有第一行的提示,我们通过cmd执行命令输出的是中文,我们通过程序调用执行输出的是英文,这个问题,有兴趣的朋友可以研究一下。
2.在Linux上执行
使用的系统环境为CentOS 7.2,.NET Core sdk版本为2.0.3。
直接执行命令结果如下:
我将代码上传到git server,然后在linux上clone然后执行结果如下:
可以看到我们获取执行输出是没有问题的,但是获取进程开始执行出错了,无法从进程检索该信息,现在我们移除统计执行时间的代码:
这下我们执行就没有问题了。从这里我们可以得出结论:由于平台的差异,获取一些信息可能会出现异常,所以我们实际一定要在多个平台上测试。
3.在OSX上运行
我在OSX上的.NET Core SDK版本为2.0.0 很久没更新了。
直接执行命令:
从git Clone代码,执行结果如下:
可以看出我们在OSX上执行是没有问题的。
四.在Windows OSX Linux 下执行脚本
1.编写测试脚本
编写脚本的主要逻辑为输出程序当前目录结构,然后输出一句话 “dotnet in 操作系统类型”
Windows: win.bat
@echo off
dir
echo "dotnet in Windows"
Linux: linux.sh
#!/bin/bashls
echo "dotnet in Linux"
OSX: OSX.sh
#!/bin/bashls
echo "dotnet in OSX"
2.编写测试代码
我将所有的脚本都放在 项目根目录/shell 文件夹下。
因为我们需要根据不同的操作类型,选择不同的脚本来进行执行,所以我们需要在代码里面判断一下操作系统类型。我们可以通过 RuntimeInformation.IsOSPlatform
来判断。
static void Main(){ string fileName="shell/"; //根据系统使用不同的shell文件
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
fileName += "win.bat";
} else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
fileName += "linux.sh";
} else
{
fileName += "OSX.sh";
} //创建一个ProcessStartInfo对象 使用系统shell 指定命令和参数 设置标准输出
var psi = new ProcessStartInfo(fileName) { RedirectStandardOutput = true }; //启动
var proc = Process.Start(psi); if (proc == null)
{
Console.WriteLine("Can not exec.");
} else
{
Console.WriteLine("-------------Start read standard output--------------"); //开始读取
using (var sr = proc.StandardOutput)
{ while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
} if (!proc.HasExited)
{
proc.Kill();
}
}
Console.WriteLine("---------------Read end------------------");
Console.WriteLine(ASP.Net Core 2.0 默认会将项目中的所有视图文件编译成一个DLL文件,后面每次对视图文件进行修改还得编译发布成DLL再更新,比较麻烦。要和ASP.NET MVC一样直接发布VIEW文件,需要修改WEB项目工程文件(.csproj)加入一句话:<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
:
.csproj 示例
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
<ItemGroup>
<Compile Remove="logfile\**" />
<Content Remove="logfile\**" />
<EmbeddedResource Remove="logfile\**" />
<None Remove="logfile\**" />
</ItemGroup>
</Project>
思路解析
默认情况下,生成项目时会把Views的视图文件编译成dll*.Views.dll
同时我们也看不到Views文件夹,如果有频繁修改视图内容的需求,这样就很不方便
我们可以将视图预编译改为运行时编译
1、添加Nuget:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.9" />
2、在项目文件的节点下添加:
<RazorCompileOnPublish>false</RazorCompileOnPublish>
3、在AddControllersWithViews()方法后添加AddRazorRuntimeCompilation()
services.AddControllersWithViews()
.AddRazorRuntimeCompilation();
4、重新发布项目,发布后就可以看到多了Views文件夹,同时*.Views.dll没了
dotNET 6代码片断:
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<StartupObject>ZoomLaCMS.Program</StartupObject>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
<RazorCompileOnBuild>False</RazorCompileOnBuild>
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
quot;Exited Code : {proc.ExitCode}");
}
}
3.在Windows下运行
在windows下运行是完全正常的。
4.在OSX运行
直接运行会报一个权限异常,如下:
使用命令加入执行权限:
chmod +x OSX.sh
然后再次执行:
可以看到成功执行了脚本。
5.在Linux上运行
直接运行也是会有权限问题的:
同样使用命令加入执行权限:
chmod +x linux.sh
然后再次执行:
可以看到成功执行了我们的脚本。
4.容易犯的错误
看见上面的例子,我都成功执行了,其实我踩了几个坑,花了我不少时间来解决。
1.sh脚本一定要指定命令解析器
也就是这句话,放在sh脚本开头
#!/bin/bash
2.不管是windows linux osx 脚本编码必须为 ANSI
不然程序执行的时候,读取字符会出错,造成执行异常。
五.写在最后
希望本文能给大家带来帮助,如有问题欢迎和我讨论。
,220)/}
平台,执行,命令,脚本,