如何使用 msBuild 在 nuke-build 中发布解决方案
Posted
技术标签:
【中文标题】如何使用 msBuild 在 nuke-build 中发布解决方案【英文标题】:How to publish solution in nuke-build using msBuild 【发布时间】:2020-12-07 16:46:36 【问题描述】:这可能是一个蹩脚的问题,也许我遗漏了一些非常明显的东西。但是我现在尝试解决这个问题几天但没有成功。
我有一个使用 .NET 框架的庞大解决方案(31 个项目)。我们曾经使用CAKE build 进行构建和部署过程,但现在我必须将该过程移至nuke-build。 我使用的是 MSBuild,而不是 DotNet。
我设法将任务(从 CAKE)转换为目标(Nuke)并修复了不同目标之间的依赖关系。解决方案构建。
但我找不到在 MSBuild 上使用目标“发布”的简单方法,也不知道如何设置发布目录。
例如,CAKE 中的一项任务如下所示:
Task("BuildService")
.Does(() =>
var csprojFile = rootSolutionDirectory + "/Core/MyProject.Service/MyProject.Service.csproj";
var publishDestination = $"tempPublishDestination/service";
MSBuild(csprojFile, new MSBuildSettings()
.WithProperty("target", "build;publish")
.WithProperty("DeployOnBuild", "true")
.WithProperty("PublishProfile", publishProfile)
.WithProperty("Configuration", configuration)
.WithProperty("Platform", platform)
.WithProperty("PublishUrl", publishDestination)
);
);
我在 NUKE 中将其转换为 Target:
Target BuildService => _ => _
.Executes(() =>
var csprojFile = rootSolutionDirectory + "/Core/MyProject.Service/MyProject.Service.csproj";
var publishDestination = $"tempPublishDestination/service";
MSBuild(s => s
.SetTargetPath(csprojFile)
.SetTargets("Rebuild", "Publish") // looks like "Publish" does nothing
.SetConfiguration(Configuration)
.SetAssemblyVersion(GitVersion.AssemblySemVer)
.SetFileVersion(GitVersion.AssemblySemFileVer)
.SetInformationalVersion(GitVersion.InformationalVersion)
.SetMaxCpuCount(Environment.ProcessorCount)
.SetNodeReuse(IsLocalBuild))
// don't know where to put publishDestination
;
);
我被困在这里了。我不知道如何告诉 MSBuild 也通过 Nuke.Common.Tools.MSBuild.MSBuildSettings 或其他对象进行“发布”。
还有,如何告诉 MSBuild 应该在哪里发布它。
我会非常感谢任何回答,最好的问候,马丁
【问题讨论】:
SetProperty(key, value)
是等价的
默认情况下,实际调用会打印到控制台。因此,您将看到 Publish
是否作为参数传递。
非常感谢,马蒂亚斯。我显然错过了那个方法。
【参考方案1】:
感谢 Matthias,我设法解决了这个问题(请参阅问题评论)。
这是我的解决方案,如果其他人有类似的问题:
Target BuildService => _ => _
.Executes(() =>
var csprojFile = RootDirectory + @"\Core\MyProject.Service\MyProject.Service.csproj";
var publishDestination = $@"TempPublishDestination\service";
MSBuildTasks.MSBuild(s => s
.SetTargetPath(csprojFile)
.SetConfiguration(Configuration)
.SetMaxCpuCount(Environment.ProcessorCount)
.SetNodeReuse(IsLocalBuild)
.SetProperty("DeployOnBuild", "true")
.SetProperty("PublishProfile", Configuration.ToString())
.SetProperty("Platform", "AnyCPU")
.SetProperty("PublishUrl", publishDestination)
.SetTargets("Build", "Publish")
);
);
谢谢
【讨论】:
【参考方案2】:如果您想避免发布配置文件:
MSBuild(s => s
.SetTargetPath(<cs proj directory>)
.SetConfiguration(Configuration)
.SetMaxCpuCount(Environment.ProcessorCount)
.SetNodeReuse(IsLocalBuild)
.SetProperty("DeployOnBuild", "true")
.SetProperty("Platform", "AnyCPU")
.SetProperty("PublishUrl", <a folder>)
.SetProperty("DeployDefaultTarget", "WebPublish")
.SetProperty("WebPublishMethod", "FileSystem")
.SetTargets("Build", "Publish")
);
【讨论】:
以上是关于如何使用 msBuild 在 nuke-build 中发布解决方案的主要内容,如果未能解决你的问题,请参考以下文章
如何找出Visual Studio发送给MSBuild的命令?
如何在 Azure Devops 中使用 msbuild 创建具有发布和调试配置的 nuget 文件
如何在 gitlab-ci.yml 中使用带有 SonarQube.Scanner.MSBuild.exe 的 Gitlab 变量