如何使用 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的命令?

如何使用msbuild首先构建依赖项目

如何真正改变 MSBuild 输出/消息语言?

如何使用 MSBuild 按特定顺序在解决方案中构建项目?

如何在 Azure Devops 中使用 msbuild 创建具有发布和调试配置的 nuget 文件

如何在 gitlab-ci.yml 中使用带有 SonarQube.Scanner.MSBuild.exe 的 Gitlab 变量