指定.NET Core 2.0.0后,CloudFoundry为何仍安装多版本?
我之前也碰到过类似的情况——CloudFoundry的.NET Core buildpack默认会优先拉取同主版本下的最新补丁版本Runtime,哪怕你已经在.csproj里明确指定了2.0.0,它还是会尝试去找2.0.x里的最新版也就是2.0.6,刚好你的MindSphere环境里没有这个版本,就报错了。给你几个实用的解决办法:
方法1:通过runtimeconfig.json强制锁定Runtime版本
你可以在项目根目录创建(或者修改自动生成的)[你的项目名].runtimeconfig.json文件,直接明确指定要使用的Runtime版本:
{ "runtimeOptions": { "framework": { "name": "Microsoft.NETCore.App", "version": "2.0.0" } } }
这个文件是.NET Core运行时的核心配置文件,buildpack会严格遵循这里的版本设置,不会再去自动拉取更高的补丁版本。
方法2:通过环境变量指定Runtime版本
推送应用的时候,直接用环境变量DOTNET_RUNTIME_VERSION强制指定版本:
cf push [你的应用名] -e DOTNET_RUNTIME_VERSION=2.0.0
如果习惯用manifest.yml管理应用配置,也可以在里面添加环境变量:
applications: - name: [你的应用名] env: DOTNET_RUNTIME_VERSION: 2.0.0
这样buildpack在检测环境时,会优先使用你指定的版本,而不是去查找同主版本的最新补丁包。
方法3:更新适配版本锁定的Buildpack
如果上面两种方法都没生效,可能是你当前使用的buildpack版本太旧,不支持严格的版本锁定逻辑。你可以先查看当前的buildpack列表:
cf buildpacks
然后更新到适配.NET Core 2.0的稳定版buildpack(注意不要用太新的buildpack,因为新版本可能已经不再支持老框架了),比如:
cf update-buildpack dotnet_core -p https://github.com/cloudfoundry/dotnet-core-buildpack/releases/download/v2.3.0/dotnet-core-buildpack-v2.3.0.zip
(这里的v2.3.0是经过验证适配.NET Core 2.0的版本,你可以根据实际情况调整)
最后提醒下,MindSphere作为基于CloudFoundry的平台,可能有自己的Runtime镜像源,确保你指定的2.0.0版本确实存在于平台的镜像仓库中,避免出现找不到版本的情况。
内容的提问来源于stack exchange,提问作者ThisWillDoIt

