首页 文章

dotnet core - 无法构建/发布osx自包含的可执行文件

提问于
浏览
1

有人可以帮忙,因为我在osx上构建一个.net核心控制台项目的噩梦 .

我正在使用dotnet --version 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

我用Google搜索了所有文档,并提到向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了!

https://docs.microsoft.com/en-us/dotnet/articles/core/tools/project-json-to-csproj

这对我来说似乎疯了??!??!

无论如何它建议将运行时添加到.csproj

我做了什么

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

我仍然得到同样的错误 .

所以我有几个问题 .

为什么编译器会查看projects.assets.json?我已经尝试将运行时添加到此文件但仍然没有看到它 . 任何想法为什么?

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

如何更改编译器的外观?

感觉就像我错过了一些简单的东西 .

顺便说一句,如果我只是使用dotnet 从我的控制台运行项目,它运行得很好(在我的Mac上),所以构建等没有问题 .

提前致谢

Update ---

进一步了解这一点 . 似乎我需要在我的project.assets.json文件中有这个

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

注意osx运行时是 osx.10-11-x64 NOT 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恢复,构建和发布正确的运行时等 . 此外,我的部署类型不是'平台',这似乎是此错误的另一个原因 .

Update 2 !!!! Got it working - Almost!!!

因此,出于某种原因,runtimeconfig.json文件为空

需要添加这个

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

所以 - 下一个技巧是找出为什么这不是由编译器自动完成的!

1 回答

  • 3

    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!
    

    要发布自包含,您需要三件事:

    • 运行时需要通过NuGet恢复 - 它将其下载到本地缓存并添加对 project.assets.json 文件的适当引用 . 这是通过以下任一方式完成
      项目文件中的

    • RuntimeIdentifier (单数)属性 . 这会将项目固定/修复到一个运行时,然后始终用于构建和发布 .
      项目文件中的

    • RuntimeIdentifiers (复数)属性指定多个RID,但不要求每个构建/发布都是特定于运行时的,允许您通过 -r 参数指定要发布的那个 .

    • 使用 dotnet restore -r osx.10.11-x64 在恢复期间指定运行时 .

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

    • 项目必须是可运行的 - 这意味着在项目文件中指定 <OutputType>Exe</OutputType>

相关问题