【问题标题】:MSBuild publish dotnet core applicationMSBuild 发布 dotnet 核心应用程序
【发布时间】:2019-08-01 14:43:18
【问题描述】:

我的设置是:我有一个包含不同 dotnet4.6 应用程序(服务)的解决方案。现在我们在这个解决方案中添加了一个 dotnet core 项目。我可以构建和调试它,但这不会创建可执行文件。在 Visual Studio 中,我可以右键单击 -> 发布...。我创建了两个配置文件(x86 和 x64),它们应该在 /bin/Publish/x86 或 /x64 中创建好的二进制文件。在 VS 这工作。该应用程序是独立的,可以在不同的未准备好的机器上运行。

但现在我需要将该进程移至构建服务器。我搞砸了dotnet publish,但最后我被卡住了,因为解决方案的其他组件不是干净的 dotnet 核心,因此构建失败。 所以我需要坚持使用 MSBuild。

目前的尝试是: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe" NewProject\NewProject.csproj /p:DeployOnBuild=true /p:UsePublishProfile=true /p:PublishProfile=x64Profile.

这表示它已成功完成构建,但我没有看到任何结果。如果我删除所有属性并只调用 msbuild 和 *.csproj,它也没有任何区别。它只是在 bin/Debug 中构建新项目,作为 dll,而不是 exe。

我也搞砸了p:PublishProfile="NewProject\Properties\PublishProfiles\x64Profile.pubxml"/p:PublishUrl="NewProject\bin\Publish\x64",但它并没有改变任何东西。

我读了几篇关于 SO 的文章,告诉我 VS 不只是使用参数调用 msbuild,而是进行内部 API 调用。不过,我需要一个解决方案。我需要构建服务器来创建可执行文件。有没有办法触发 msbuild 来创建那个?

【问题讨论】:

    标签: .net-core msbuild


    【解决方案1】:

    哦,伙计,我现在搜索了 2-3 天。而且 - 与 StackOverflow 上的往常一样 - 在询问后不久,我自己找到了一个可行的答案。

    tl;博士:

    项目.csproj:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFrameworks>netcoreapp2.1</TargetFrameworks>
        <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>  
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
        <RootNamespace>Company.Toolset.Exporter</RootNamespace>
        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
        <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
        <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
      </PropertyGroup>
      
      <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />
    ...
    

    MSBuild 命令:

    msbuild Project\Project.csproj -t:restore /t:Build;Publish /p:Configuration=Release /p:Platform=x86 /p:PublishProfile=x86Profile /p:OutputPath=bin/Publish/x86(x64 也一样)

    说明:

    我认为是 dotnet build/publish 命令要我将 TargetFrameworks 更改为 TargetFramework。但对于 MSBuild,这是错误的。 dotnet 在这里不起作用,因为解决方案是混合 dotnet 核心和 dotnet 框架。所以必须解决这个问题。

    命令需要&lt;RuntimeIdentifiers&gt;win-x86;win-x64&lt;/RuntimeIdentifiers&gt;。我将它添加到 *.csproj 是因为我知道我只为 Windows 构建(目前)并且我需要两个版本。

    我真的不知道为什么我需要这条线 &lt;Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" /&gt;,但是没有这个发布和使用 PublishProfiles 没有按预期工作。

    帮助我到达这里的链接:(未排序)

    https://github.com/Microsoft/msbuild/issues/1901

    https://github.com/aspnet/vsweb-publish/issues/22

    How to Publish Web with msbuild?

    ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json

    Configure MSBuild output path

    【讨论】:

    • 这只是我的直觉,但如果您使用&lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt; 而不是使用库 SDK,是否会简化您的 csproj?
    • 这个项目文件的第一行有问题,就像其他评论指出的那样。您也不应该将其修改为使用 Microsoft.WebApplication.targets,因为这是 ASP.NET 4.x 项目的典型步骤。这可能是一个误导性的答案,因为 ASP.NET 和 ASP.NET Core 项目应该被区别对待并且没有太多的黑客攻击。
    【解决方案2】:

    我也做过噩梦,Visual Studio IDE 的构建与 dotnet publish 命令之间的不一致,只能通过使用 msbuild.exe 来解决。另外,使用 /p:PublishProfiles=theXMLthatVSgenerates.xml 从来没有用过,所以我不得不将每个选项都分解到 msbuild 命令行中。

    这对我有用:

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" C:\Users\xxxx\Source\Repos\netcore-agent1\CoreAgent1\CoreAgent1.csproj /t:Restore;Rebuild;Publish /p:PublishSingleFile=True /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=Release /p:Platform=x64 /p:TargetFrameworks=netcoreapp3.1 /p:PublishDir=bin\Release\netcoreapp3.1\publish\win-x64 /p:RuntimeIdentifier=win-x64 /p:PublishReadyToRun=False /p:PublishTrimmed=False
    

    【讨论】:

    • 几天来一直在寻找这个解决方案 - 似乎“dotnet publish”与从 Visual Studio 发布不同。这解决了我的问题 - 非常感谢!
    • 解决了我的问题。需要指出的是,当使用“/p:SelfContained=True”时,还必须设置 RuntimeIdentifier。示例:“/p:RuntimeIdentifier=win-x64”//是的,您已经在选项列表中找到了它。
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2020-09-12
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多