用MSBuild构建ASP.NET项目时如何复制项目内容?

5
我正在编写一些新的构建脚本,以构建我们几个应用程序。现有脚本使用MSBuild在原地构建所有项目,然后手动复制所有内容(视图、脚本等)和bin文件夹到一个工件文件夹中进行压缩;这要求将不属于ASP.NET项目bin目录的所有文件和文件夹明确列在一个配置文件中,这当然极易出现错误。
是否可以在指定输出目录时,使用MSBuild包括内容文件?理想情况下,无需创建发布配置文件,因为当前的部署方法不能更改,所以我需要确保我的构建工件与当前的工件相匹配。
如果有帮助,我计划使用Cake进行构建机制。

你可以使用后构建事件来实现这个目的。类似于这样的方式?只是出于好奇,你是作为CI过程的一部分来完成这个任务的吗? - dnlgmzddr
我不相信这会起作用,因为输出目录(bin文件夹)不包含ASP.NET内容,所有内容都保留在解决方案目录中,复制该文件夹当然也会获取源代码。 - user1618236
正如问题所述,我无法使用发布配置文件,因为我们有一个定制的部署引擎,目前不能偏离。更具体地说,我需要输出的zip文件具有非常特定的结构,这是我无法通过发布配置文件来复制的。 - user1618236
@Rob,除非我漏掉了什么需要几乎完全手动配置的地方,否则我需要明确定义要复制到输出目录的文件。 - user1618236
@Phaeze 没错,但是任何被引用的内容通常都应该包含在项目中。如果你引用了解决方案中不存在的脚本/文件,VS会给你警告。 - Rob
显示剩余4条评论
1个回答

3

利用Cake框架,我得以想出一个有些凌乱的解决方案:

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”的所有项目;这是我们所有Web应用程序的命名方式,因此对我们来说是安全的,但肯定可以改进。
一旦我们确定了ASP.NET项目,我们将复制其bin内容,然后循环遍历其中的文件,以查找未标记为编译且排除某些特定文件(如设置文件和nuget包配置文件)的文件。
最后,我们能够使用该文件的相对路径将文件复制到构件目录中。

我有一个Cake脚本,它将一些文件从其他目录复制到项目/bin目录中。然后Cake调用执行MSBuild的任务。但是我没有在生成的package/bin目录中看到该文件。MSBuild会清理该目录吗?我该如何实现这一点?有什么想法吗? - Vivek Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接