MSBuild发布dotnet核心应用程序

时间:2019-03-11 09:56:33

标签: .net-core msbuild

我的设置是:我有一个解决方案,其中包含不同的dotnet4.6应用程序(服务)。现在,我们在此解决方案中添加了一个dotnet核心项目。我可以构建和调试它,但这不会创建可执行文件。在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创建那个?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

tl; dr:

Project.csproj:

// parent app
// package.json
"my-child-app": "^0.1.0"

// ChildApp.jsx
import ChildApp from "my-child-app";
...
render() {
  return <ChildApp appHistory={history} />;
}

// child app
render() {
  const { history } = createHistory(this.props.appHistory);
  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Router history={history}>
          <Switch>
            <Route path="*" component={MyComponent} />
          </Switch>
        </Router>
      </PersistGate>
    </Provider>
  );
}

MSBuild命令:

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworks>netcoreapp2.1</TargetFrameworks> <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <RootNamespace>Akka.RetUsLight.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" /> ... (与x64相同)

说明:

我认为是msbuild Project\Project.csproj -t:restore /t:Build;Publish /p:Configuration=Release /p:Platform=x86 /p:PublishProfile=x86Profile /p:OutputPath=bin/Publish/x86命令让我将dotnet build/publish更改为TargetFrameworks。但是对于MSBuild,这是错误的。 TargetFramework在这里不起作用,因为解决方案是混合使用dotnet核心和dotnet框架。所以必须解决。

该命令需要dotnet。我将其添加到* .csproj,因为我知道(目前)仅针对Windows构建,并且我需要两个版本。

我真的不知道为什么需要此行<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>,但是如果没有发布,并且使用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