2017-04-11 48 views
1

有人可以请帮助,因为我有一个噩梦在OSX上构建.net核心控制台项目。dotnet核心 - 无法建立/发布OSX自包含的可执行文件

我用的dotnet - 版本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不再使用!

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上),这样就与构建等没有问题..

在此先感谢

更新---

明白了这一点。看来我需要拥有这个在我project.assets.json文件

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

通知OSX运行时间osx.10-11-x不osx.10.11-64。这个错字似乎在网络上无处不在。也许它已经改变了。

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

但是现在尝试运行此提供了以下错误

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

用Google搜索这一点,并没有任何的建议或原因似乎与我的情况。我已经做了DOTNET恢复,建造和发布正确的版本等。还我的部署类型不是“平台”,这似乎是另一个原因这个错误。

更新2 !!!!得到它的工作 - 几乎!

所以原来由于某些原因,runtimeconfig.json文件是空

添加此

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

所以需要 - 未来关键是要找出为什么这个没有被自动的完成编译器!

+0

对于自包含的应用,runtimeconfig指定<OutputType>Exe</OutputType>。 json应该是空的。添加“框架”部分使得应用程序不再是“独立的”。相反,它现在是“依赖于框架”,这意味着您的应用程序依赖于共享的系统范围内的.NET Core版本来存在于目标系统上。 –

+0

你不应该编辑'project.assets.json'文件。这是一个NuGet使用输入输入的中间文件。的csproj。 SDK的其余部分读取此文件以查找NuGet恢复的所有资产。 –

回答

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! 

为了发布自足需要三样东西:

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

2.A RuntimeIdentifier该已经或者通过使用dotnet publish -r osx.10.11-x64或通过在该项目文件中指定RuntimeIdentifier(单数)恢复了必须在指定发布,

  • 项目必须是可运行的 - 这意味着在项目文件
  • +0

    有关.NET Core支持的应用程序模型的文档,请参阅https://docs.microsoft.com/en-us/dotnet/articles/core/deploying/。一般来说,@Lenny D,你几乎已经拥有了它,但是你在osx中​​使用了错误的字符串。 'osx.10-11-x64'不正确。您需要在.csproj中使用'osx.10.11-x64',正如@Martin Ullrich指出的那样。 –

    相关问题