2014-05-19 2 views
0

제 자리에서 우리는 너겟을 통해 패키지되고 내부 너겟 서버에 게시 된 다양한 유틸리티 기능을 제공하는 많은 프로젝트가 포함 된 '핵심'솔루션을 보유하고 있습니다. 포장 할MSBuild 내의 솔루션에서 루프 프로젝트

<Exec Command="nuget pack &quot;$(ProjectRoot)\Domain\Domain.csproj&quot; -Properties Configuration=$(Configuration)" /> 
<Exec Command="nuget pack &quot;$(ProjectRoot)\Logging\Logging.csproj&quot; -Properties Configuration=$(Configuration)" /> 
<Exec Command="nuget pack &quot;$(ProjectRoot)\Logging.NLog\Logging.NLog.csproj&quot; -Properties Configuration=$(Configuration)" /> 
<Exec Command="nuget pack &quot;$(ProjectRoot)\Persistence\Persistence.csproj&quot; -Properties Configuration=$(Configuration)" /> 
<Exec Command="nuget pack &quot;$(ProjectRoot)\Persistence.NHibernate\Persistence.NHibernate.csproj&quot; -Properties Configuration=$(Configuration)" /> 

우리는 약 20 프로젝트가 이런 식으로 포장되고 있고, 때마다 우리는 새로운 프로젝트를 소개 : 우리의 CI에서 nuget 포장을 달성하기 위해, 우리는 현재이처럼 보이는은 MSBuild 스크립트를 MSBuild 스크립트에 다른 행을 추가해야합니다. 우리가 시험을 제외 루프에서 각 프로젝트를 심문 할 수 있어야합니다 것, 또한 ... 뭔가에이 스크립트를 응축하여

<foreach project in solution> 
    <Exec Command="nuget pack project -Properties Configuration=$(Configuration)" /> 
</foreach> 

을 MSBUILD를 사용하여 솔루션에서 프로젝트를 열거하고 가능 프로젝트 (이이 테스트 디렉토리에 모두 그렇게 사소한해야합니까?)

편집 : 루프에서의 MSBuild 작업을 실행의 문제 만 해결 수동으로 항목을 열거하는 것을 포함와 questions 거래가에 따라 반복되는 Other ItemGroup을 사용하면 약간 간단하지만 매우 자세한 코드가 생성됩니다. 가능한 경우 수작업으로 프로젝트를 열거하는 것을 피하고 싶습니다.

+0

가능한 [duplicate] (http://stackoverflow.com/q/6036748/1997232). – Sinatr

+0

@Sinatr 그 질문을 보았지만 문제점을 해결하지 못했습니다. 해결책은 ItemGroup의 내용에 대해 반복 될 수 있지만 여전히 ItemGroup에 수동으로 프로젝트 이름을 입력해야한다는 솔루션이 있습니다. 가능하다면 실제로 모든 프로젝트의 이름을 지정하는 것을 피하고 싶습니다. –

+0

그리고 [this one] (http://stackoverflow.com/q/12948037/1997232/)은 어떻습니까? 및 [this] (http://stackoverflow.com/q/3491308/1997232)? – Sinatr

답변

1

SolutionDirSolutionName 속성을 사용하여 솔루션 파일을 찾은 다음 사용자 지정 대상을 작성하여 솔루션에 포함 된 모든 프로젝트를 찾을 수 있습니다. 나는 이런 식으로했다 :

<Target Name="AfterBuild" DependsOnTargets="PublishNuGetPackages" /> 
<Target Name="PublishNuGetPackages"> 
    <CollectNuGetProjects SolutionDir="$(SolutionDir)" SolutionName="$(SolutionName)"> 
     <Output TaskParameter="NuGetProjects" ItemName="NuGetProjects" /> 
    </CollectNuGetProjects> 
    <Message Text="Collected the following nuget projects: @(NuGetProjects)" Importance="high" /> 
    <Exec Command="nuget pack &quot;$(SolutionDir)\%(NuGetProjects.Identity)&quot; -Properties Configuration=$(Configuration)" /> 
    <!-- publish packages etc... --> 
</Target> 

<UsingTask TaskName="CollectNuGetProjects" 
     TaskFactory="CodeTaskFactory" 
     AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <SolutionName ParameterType="System.String" Required="true" /> 
     <SolutionDir ParameterType="System.String" Required="true" /> 
     <NuGetProjects ParameterType="System.String[]" Output="true" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System.Linq" /> 
     <Using Namespace="System" /> 
     <Using Namespace="System.Linq" /> 
     <Using Namespace="System.Text.RegularExpressions" /> 
     <Code Type="Fragment" Language="cs"> 
      <![CDATA[ 
       var solutionFile = Path.Combine(SolutionDir, SolutionName + ".sln"); 
       var solutionText = File.ReadAllText(solutionFile); 
       NuGetProjects = Regex.Matches(solutionText, @"""(?<projectFile>[^""]+?\.(csproj|wixproj|vcxproj))""") 
        .Cast<Match>() 
        .Select(m => m.Groups["projectFile"].Value) 
        .Where(p => !p.Contains(@"\Tests\")) 
        .ToArray(); 
     ]]> 
     </Code> 
    </Task> 
</UsingTask> 

또한 당신이 원하는대로 폴더 Tests에있는 프로젝트를 필터링 사용자 지정 작업.

+0

@sburg에게 감사드립니다. –

+0

그냥 테스트를 거쳐 대우를받습니다! 감사 :) –

관련 문제