`未处理的exception:System.ArgumentNullException:值不能为空.`使用启动脚本运行`dotnet run`时出错

我试图运行一个dotnet应用程序使用dotnet run --configuration Release在系统服务器启动/重新启动。 我正在使用一个init.d脚本达到相同的效果。

我的启动脚本位于/etc/init.d/myscript包含以下内容:

 #!/bin/sh /home/user/myscripts/botScript.sh 

botScript.sh内容:

 #!/bin/bash cd /home/user/bot/ nohup dotnet run --configuration Release & 

当我的服务器启动或重新启动启动脚本得到执行,但dotnet run不起作用。 我收到以下错误:

 Unhandled Exception: System.ArgumentNullException: Value cannot be null. Parameter name: path1 at System.IO.Path.Combine(String path1, String path2, String path3) at Microsoft.DotNet.ProjectModel.Resolution.PackageDependencyProvider.ResolvePackagesPath(String rootDirectory, GlobalSettings settings) at Microsoft.DotNet.Configurer.NuGetCacheSentinel.get_NuGetCachePath() at Microsoft.DotNet.Configurer.NuGetCacheSentinel.Exists() at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.ShouldPrimeNugetCache() at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure() at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel) at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient) at Microsoft.DotNet.Cli.Program.Main(String[] args) 

但所有其他命令在该脚本中工作正常,甚至简单地运行dotnet也可以正常工作(我已经检查过)。 只是这个dotnet run不起作用。

是的,但是当我运行的脚本, myscript以及botScript.sh ,login到我的服务器后,它工作正常,没有任何错误。

请,谁能帮我解决这个问题?

PackageDependencyResolver显然存在一个错误,但要找到解决方法,请考虑找到packages文件夹的顺序:

  1. global.json { "packages": "..." }
  2. NUGET_PACKAGES环境变量。
  3. {DefaultLocalRuntimeHomeDir}\packages

你的代码一直在上面的例子#3中。 要解决此问题,请创建一个名为NUGET_PACKAGES的环境变量,指向您的packages文件夹。 例如,在botScript.sh

 #!/bin/bash cd /home/user/bot/ export NUGET_PACKAGES="/home/user/.nuget/packages" # <=== nohup dotnet run --configuration Release & 

有关更多信息,请参阅PackageDependencyResolver.cs和PackageDependencyResolver.cs

不要以root用户运行dotnet

如果它从init.d运行,它将以root用户身份进行调用。 使用root运行程序会使您的机器遭受严重的安全问题,特别是在.net内核的情况下,这个问题仍然处于重大的发展阶段,所以目前还没有加强安全性。

使用特定用户运行服务

您的错误可能是由于以下事实造成的:对于root没有定义软件包目录,但是当您手动运行软件包时,它与您的user定义了/home/user/.nuget/packages目录。

  • 从asp.net核心文档 ,你可以设置一个服务,并指定将运行dotnet的用户
  • 只需使用su命令来运行指定用户的dotnet

主管用户

这里是我自己的网站主管conf的摘录

/etc/supervisor/conf.d/mysite.conf

 [program:mysite] command=/usr/bin/dotnet /var/www/mysite/MySite.dll directory=/var/www/mysite autostart=true autorestart=true stderr_logfile=/var/log/mysite.err.log stdout_logfile=/var/log/mysite.out.log environment=ASPNETCORE_ENVIRONMENT=Production user=www-data <=== SPECIFY A USER HERE stopsignal=INT 

在开发/调试之外不要使用dotnet run

正如dotnet --help所说,run命令编译并执行一个项目。

 run Compiles and immediately executes a .NET project 

编译将需要额外的步骤,然后计算能力和额外的时间(每次运行,即使代码没有变化)。 它也将需要恢复和建立工作(这需要一个正常的开发人员用户)。 由于额外的步骤可能会失败,因此也更容易出错。

相反,运行你的开发人员用户编译一次,然后运行你的程序与服务用户,如万维网数据(这是一种内置用户的网站)

 dotnet MyCompiledAssembly.dll