【问题标题】:Unable to build / publish OS X self-contained .NET Core executable无法构建/发布 OS X 自包含的 .NET Core 可执行文件
【发布时间】:2017-09-06 17:34:22
【问题描述】:

我在 OS X 上构建 .NET Core 控制台项目时做噩梦。

我使用的是 .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

我用谷歌搜索了这个,所有文档都提到将运行时添加到 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已经不用了!

A mapping between project.json and csproj properties

这对我来说似乎很疯狂??!??!

无论如何,它建议将运行时添加到 .csproj 文件中。

我做了什么:

 PropertyGroup>
  <RuntimeIdentifiers>win7-x64;osx.10-11-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>

我仍然遇到同样的错误。

所以我有几个问题。

为什么编译器会查看 projects.assets.json? 我尝试将运行时添加到该文件中,但仍然看不到它。为什么?

为什么编译器没有在 projects.json 或 .csproj 文件中查找,而网络上的其他人似乎都在说它应该查找?

如何更改编译器的外观?

感觉好像我错过了一些简单的东西。

顺便说一句:如果我只是使用 dotnet {projectname} 从控制台运行项目,它运行得很好(在我的 Mac 上),因此构建等方面没有任何问题。

更新---

我更进一步。看来我需要在我的 project.assets.json* 文件中有这个:

 "runtimes": {
  "osx.10-11-x64": {
    "#import": []
  },
  "ubuntu.16.04-x64": {
    "#import": []
  },
  "win7-x64": {
    "#import": []
  }
}

请注意,OS X 运行时是osx.10-11-x64,不是osx.10.11-x64。这种错字似乎在网络上无处不在。也许它已经改变了。

所以它现在可以编译,我得到一个发布文件夹。

但是,现在尝试运行它会出现以下错误

A fatal error was encountered. The library 'libhostpolicy.dylib' required to execute the application was not found in 'xxx/xxx'.

我已经用谷歌搜索过了,但似乎没有任何建议或理由与我的情况相符。我已经完成了dotnet restore,为正确的运行时构建和发布等。此外,我的部署类型不是“平台”,这似乎是导致此错误的另一个原因。

更新 2!!!!我搞定了——几乎!!

由于某种原因,runtimeconfig.json 文件为空。

我需要添加这个:

 {
  "runtimeOptions": {
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "1.1.0"
    }
  }
}

所以 - 下一个技巧是找出编译器没有自动完成的原因!!

【问题讨论】:

  • 对于自包含应用程序,runtimeconfig.json 应该为空。添加“框架”部分使应用程序不再“独立”。相反,它现在是“依赖于框架”的,这意味着您的应用依赖于在目标系统上存在的共享系统范围版本的 .NET Core。
  • 您永远不必编辑project.assets.json 文件。这是 NuGet 使用来自 .csproj 的输入写入的中间文件。 SDK 的其余部分读取此文件以查找所有已恢复的 NuGet 资产。

标签: .net macos build console .net-core


【解决方案1】:

TL;DR 这很好用:

<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!

为了发布自包含的内容,您需要三件事:

  1. 运行时需要通过 NuGet 恢复 - 它将其下载到本地缓存并将适当的引用添加到 project.assets.json 文件。这是通过以下任一方式完成的:
    • 项目文件中的RuntimeIdentifier(单数)属性。这会将项目固定/修复到一个运行时,然后始终用于构建和发布。
    • 项目文件中的 RuntimeIdentifiers(复数)属性指定多个 RID,但并不要求每个构建/发布都特定于运行时,允许您通过 -r 参数指定您想要发布的那个。
    • 使用dotnet restore -r osx.10.11-x64 指定还原期间的运行时间。

2.必须在发布期间指定已恢复的 RuntimeIdentifier,方法是使用dotnet publish -r osx.10.11-x64 或在项目文件中指定RuntimeIdentifier(单数)

  1. 项目必须是可运行的 - 这意味着在项目文件中指定&lt;OutputType&gt;Exe&lt;/OutputType&gt;

【讨论】:

  • 有关 .NET Core 支持的应用模型的文档,请参阅 docs.microsoft.com/en-us/dotnet/articles/core/deploying。通常,@Lenny D,您几乎拥有它,但是您为 osx 使用了错误的字符串。 osx.10-11-x64 不正确。正如@Martin Ullrich 指出的那样,您需要在.csproj 中使用osx.10.11-x64
猜你喜欢
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2019-07-12
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多