我的设置是:我有一个解决方案,其中包含不同的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创建那个?
答案 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