【问题标题】:How can I copy the content of ASP.NET project when building with MSBuild?使用 MSBuild 构建时如何复制 ASP.NET 项目的内容?
【发布时间】:2015-08-11 07:10:27
【问题描述】:

我正在为我们的一些应用程序编写一些新的构建脚本,当前脚本使用 MSBuild 构建所有项目,然后手动复制所有内容(视图、脚本等)和 bin手动文件夹到要压缩的工件文件夹;这要求所有不属于 ASP.NET 项目的 bin 目录的文件和文件夹都明确列在配置文件中,这当然非常容易出错。

在指定输出目录时是否可以使用 MSBuild 来包含内容文件?理想情况下,这将在不创建发布配置文件的情况下完成,因为当前的部署方法无法更改,因此我需要确保我的构建工件与当前的工件匹配。

如果有帮助,我打算使用 Cake 作为构建机制。

【问题讨论】:

  • 您可以使用构建后事件来归档它。 this 之类的东西?只是出于好奇,您是否将其作为 CI 流程的一部分?
  • 它将被 teamcity 使用,但也应该可以在开发机器上运行。
  • 我不相信这会起作用,因为输出目录(bin 文件夹)不包含 ASP.NET 内容,内容全部保留在解决方案目录中,并且该文件夹的副本当然会同时获取源代码。
  • 好的,太好了,因为您可以使用 ASP.NET 应用程序的发布配置文件并使其准备好生产(删除调试标志),并指定最终目标路径。
  • 如问题中所述,我不能使用发布配置文件,因为我们有一个当前无法偏离的自定义部署引擎。为了更具体,我需要输出的 zip 文件具有非常具体的结构,我无法使用发布配置文件复制。

标签: c# asp.net msbuild cakebuild


【解决方案1】:

利用蛋糕,我想出了一个有点混乱的解决方案:

var excludedFiles = new List<string>{"Settings.settings", "packages.config"};
var artifactDir = "./Artifact";
var solutionFile = "./MySolution.sln";

Task("Package")
    .IsDependentOn("Build")
    .Does(() =>
    {
        var solution = ParseSolution(solutionFile);
        foreach (var project in solution.Projects)
        {
            var parsedProject = ParseProject(project.Path);
            var binDir = project.Path.GetDirectory() + Directory("/bin");

            if(project.Name.Contains("Host"))
            {             
                var soaDir = Directory(artifactDir + "/SOA");
                CreateDirectory(soaDir);
                CopyDirectory(binDir, soaDir + Directory("bin"));
                foreach(var file in parsedProject.Files)
                {
                    if(!file.Compile && excludedFiles.All(x=> !file.FilePath.ToString().Contains(x)))
                    {                        
                        var newFilePath = soaDir + File(file.RelativePath);
                        CreateDirectory(((FilePath)newFilePath).GetDirectory());
                        CopyFile(file.FilePath, newFilePath);
                    }
                }
            }
        }        
    });

这里的包任务将在解决方案中解析一个循环遍历项目以查找包含单词 Host 的任何项目是他们的名字;这就是我们所有网络应用程序的命名方式,因此对我们来说它是安全的,但绝对可以改进。

一旦我们确定了 ASP.NET 项目,我们就会复制它的 bin 内容,然后遍历它的文件以查找任何未标记为编译的文件,并排除一些特定文件,如设置文件和 nuget 包配置文件。

最后我们可以使用该文件的相对路径将文件复制到工件目录中。

【讨论】:

  • 我有一个蛋糕脚本,可以将其他目录中的一些文件复制到项目/bin中。然后 cake 调用执行 MSBuild 的任务。我没有在生成的 package/bin 目录中看到该文件。 MSBuild 是否清理该目录?我怎样才能做到这一点?有什么想法吗?
猜你喜欢
  • 2012-04-23
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多