无法生成/发布OS X自足的.NET核心可执行文件
我在OSX上构建.NET核心控制台项目时遇到了一个噩梦 我使用的是.NET版本1.0.1 当我尝试从终端运行以下命令时无法生成/发布OS X自足的.NET核心可执行文件,.net,macos,build,console,.net-core,.net,Macos,Build,Console,.net Core,我在OSX上构建.NET核心控制台项目时遇到了一个噩梦 我使用的是.NET版本1.0.1 当我尝试从终端运行以下命令时 dotnet publish --framework netcoreapp1.1 --runtime osx.10.11-x64 我得到以下错误: \project.assets.json' doesn't have a target for '.NETCoreApp,Version=v1.1/osx.10.11-x64 我已经在谷歌上搜索过了,所有的文档都提到向proje
dotnet publish --framework netcoreapp1.1 --runtime osx.10.11-x64
我得到以下错误:
\project.assets.json' doesn't have a target for '.NETCoreApp,Version=v1.1/osx.10.11-x64
我已经在谷歌上搜索过了,所有的文档都提到向project.json添加运行时,就像这样
"runtimes": {
"win10-x64": {},
"win8-x64": {},
"osx.10.10-x64": {},
"osx.10.11-x64": {
"#import": [ "osx.10.11", "osx.10.10-x64" ]
},
"osx.10.12-x64": {
"#import": [ "osx.10.12", "osx.10.11-x64" ]
},
"debian.8-x64": {}
},
但是我没有projects.json,只有projects.assets.json,编译器似乎正在查找它
经过进一步调查,我发现了以下链接。这意味着project.json文件不再使用
我觉得这很疯狂
无论如何,它建议将运行时添加到.csproj文件中
我已经做到了:
PropertyGroup>
<RuntimeIdentifiers>win7-x64;osx.10-11-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>
请注意,OSX运行时是OSX.10-11-x64,而不是OSX.10.11-x64。这种错误似乎在web上随处可见。也许它已经改变了
现在它编译了,我得到了一个发布文件夹
但是,现在尝试运行它会出现以下错误
A fatal error was encountered. The library 'libhostpolicy.dylib' required to execute the application was not found in 'xxx/xxx'.
我已经在谷歌上搜索过了,没有一个建议或理由与我的情况相符。我已经完成了dotnet还原
,为正确的运行时进行了构建和发布,等等。此外,我的部署类型不是“平台”,这似乎是导致此错误的另一个原因
更新2!!!!我让它工作-几乎强>
由于某种原因,runtimeconfig.json文件是空的
我需要补充一点:
{
"runtimeOptions": {
"framework": {
"name": "Microsoft.NETCore.App",
"version": "1.1.0"
}
}
}
所以-下一个技巧是找出为什么编译器不会自动完成这项工作 TL;博士:这很好用:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<RuntimeIdentifiers>win7-x64;osx.10.11-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
要发布自包含的内容,您需要三件事:
project.assets.json
文件添加适当的引用。这可以通过以下方式实现:
(单数)属性。这将把项目固定/修复到一个运行时,该运行时也将始终用于构建和发布项目文件中的RuntimeIdentifier
- 项目文件中指定多个RID的
(复数)属性,但不要求每个生成/发布都是特定于运行时的,允许您通过RuntimeIdentifiers
参数指定发布时需要的一个-r
- 使用
指定还原期间的运行时dotnet restore-r osx.10.11-x64
dotnet publish-r osx.10.11-x64
或通过在项目文件中指定RuntimeIdentifier
(单数)来指定已还原的运行时标识符
Exe
有关.NET Core支持的应用程序模型的文档,请参阅。总的来说,@Lenny D,你几乎拥有了它,但是你对osx使用了错误的字符串<代码>osx.10-11-x64不正确。正如@Martin Ullrich所指出的,您需要在.csproj中使用
osx.10.11-x64
。对于自包含的应用程序,runtimeconfig.json应该是空的。添加“框架”部分使应用程序不再是“自包含的”。相反,它现在是“依赖于框架的”,这意味着您的应用程序依赖于目标系统上存在的共享系统范围的.NET Core版本。您不必编辑project.assets.json
文件。这是NuGet使用.csproj的输入写入的中间文件。SDK的其余部分读取此文件,以查找NuGet还原的所有资产。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<RuntimeIdentifiers>win7-x64;osx.10.11-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
testapp$ dotnet restore
testapp$ dotnet publish -r osx.10.11-x64
testapp$ ./bin/Debug/netcoreapp1.1/osx.10.11-x64/publish/testapp
Hello World!