2015-08-06 5 views
4

Я работаю над написанием некоторых новых скриптов сборки для нескольких наших приложений, текущие скрипты создают все проекты на месте с помощью MSBuild, а затем вручную копируют все содержимое (представления, скрипты и т. Д.) И папку bin вручную в папку артефактов, которую нужно закрепить; это требует, чтобы все файлы и папки, которые не являются частью каталога bin для проекта ASP.NET, явно указаны в файле конфигурации, который, конечно же, очень подвержен ошибкам.Как скопировать содержимое проекта ASP.NET при создании с помощью MSBuild?

Есть ли способ использования MSBuild при указании выходного каталога, который также включает файлы содержимого? В идеале это было бы сделано без создания профиля публикации, поскольку текущий метод развертывания не может быть изменен, поэтому мне нужно убедиться, что артефакт сборки соответствует текущему.

Если это помогает, я планирую использовать Cake для механизма сборки.

+0

Вы можете использовать событие post-build для его архивации. Что-то вроде [этого] (http://stackoverflow.com/questions/834270/visual-studio-post-build-event-copy-to-relative-directory-location)? И просто из любопытства вы делаете это как часть процесса CI? – dnlgmzddr

+0

Он будет использоваться командой teamty, но также должен быть запущен на dev-машине. – Phaeze

+0

Я не верю, что это будет работать, поскольку выходной каталог (папка bin) не содержит контент ASP.NET, содержимое остается в каталоге решений, и копия этой папки, конечно же, также получит исходный код. – Phaeze

ответ

2

Используя торт, который я смог придумать несколько грязного раствора:

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); 
        } 
       } 
      } 
     }   
    }); 

Пакет задача здесь будет разбирать в растворе цикл в рамках проектов, чтобы найти любые, которые содержат слово хоста является их имена ; вот как все наши веб-приложения названы так для нас, это безопасно, но может быть определенно улучшено.

После того, как мы определили проект ASP.NET, мы скопируем содержимое его бина, а затем процитируем его файлы, чтобы найти любые, которые не помечены для компиляции, и исключили некоторые определенные файлы, такие как файл настроек и файл конфигурации пакетов nuget.

Наконец, мы можем использовать относительный путь к файлам для копирования файла в каталог артефакта.