2012-03-07 2 views
4

Jenkins 기반 자동화 된 웹 응용 프로그램 빌드/배포 (.NET 4.0)를 수행하려고합니다. 웹 응용 프로그램 프로젝트에는 여러 프로젝트 참조가 있으며이 프로젝트 참조는 타사 DLL을 참조합니다.MSBuild 웹 배포로 두 번째 수준의 이진 참조가 누락되었습니다.

문제 :

  1. 두 번째 수준의 참조를 (프로젝트 참조의 참조) 배포 패키지를 구축하기위한 사용의 obj\<CONFIGURATION>\Package\PackageTmp\bin 폴더에 bin 폴더에 들어갔습니다되지 않습니다.
  2. Visual Studio에서 빌드하면 두 번째 수준 참조가 일반 빌드 출력 디렉터리로 끌어옵니다.
  3. MSBuild를 사용하여 빌드 할 때 두 번째 수준 종속성은 일반 출력 디렉터리 나 PackageTmp\bin 디렉터리로 가져 오지 않습니다.

이것은 MS가 Won't-Fix 호 here으로 확인한 것입니다.

관련 질문 here, herehere이 내 문제와 일치하지 않거나 작동하지 않는 솔루션을 제공합니다. 모든 답변을 수락 한 것뿐만 아니라 검토했습니다.

MSBuild를 MySolution.sln/P : 구성 = 통합/P : 플랫폼 = "모든 CPU"/ t : 청소, 빌드/P

내 빌드 명령이 (MSBuild를 4.0을 사용)과 같은 : DeployOnBuild = 참/P : DeployTarget = 패키지 /P : 내가 수동으로 프로젝트 파일의 참조 요소를 수정하려고했습니다

AutoParameterizationWebConfigConnectionStrings = 거짓, 아니 성공, <Private>True</Private>를 추가.

두 번째 수준의 종속성이 웹 게시 임시 디렉터리에 자동으로 올바르게 전달되도록이 알려진 문제를 해결하려고합니다.

나의 현재 시도는 DLL을 here을 찾기위한 몇 가지의 MSBuild 코드와 결합 된 일반적인 접근 here (A MyProject.wpp.targets 다음 웹 프로젝트 파일에 파일을 추가하여 웹 게시 파이프 라인을 사용자 정의)를 결합합니다. 지금까지는 결과가 생성되지 않았거나 프로젝트 파일이 손상되었습니다. 나는 사용자 정의 MSBuild 코드에 익숙하지 않고 매우 모호하다.

내 질문 : 내 특정 사례에서 작동하는보다 완벽한 예를 찾고 있습니다. I 목표는 패키지 temp 디렉토리에 복사 할 파일을 모으고 두 번째 수준의 종속성을 추가하는 웹 게시 파이프 라인에 개입하는 것입니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <BRPathFiles Include="$(SolutionDir)..\Common\**\*.dll;$(SolutionDir)**\*.dll" /> 
     <ConfigPathFiles Include="$(SolutionDir)..\Common\**\*.config;$(SolutionDir)**\*.config" /> 
    </ItemGroup> 

    <Target Name="CopySecondLevelDependencies" BeforeTargets="CopyAllFilesToSingleFolderForPackage"> 
     <RemoveDuplicates Inputs="@(BRPathFiles->'%(RootDir)%(Directory)')">  
     <Output TaskParameter="Filtered" ItemName="BRPaths" /> 
     </RemoveDuplicates> 
     <RemoveDuplicates Inputs="@(ConfigPathFiles->'%(RootDir)%(Directory)')">  
     <Output TaskParameter="Filtered" ItemName="ConfigPaths" /> 
     </RemoveDuplicates>  

     <CreateItem Include="%(BRPaths.Identity);%(ConfigPaths.Identity);"> 
     <Output ItemName="FileList" TaskParameter="Include"/> 
     </CreateItem> 

     <CreateItem Value="@(BRSearchPath);$(ConfigSearchPath)"> 
     <Output TaskParameter="Value" PropertyName="SecondLevelFiles" /> 
     </CreateItem> 
    </Target>  
    <ItemGroup> 
     <FilesForPackagingFromProject 
     Include="%(SecondLevelFiles->'$(OutDir)%(FileName)%(Extension)')"> 
     <DestinationRelativePath>$(_PackageTempDir)\bin\%(FileName)%(Extension)  </DestinationRelativePath> 
     <FromTarget>CopySecondLevelDependencies</FromTarget> 
     <Category>Run</Category> 
     </FilesForPackagingFromProject> 
    </ItemGroup> 
</Project> 

답변

0

당신이 당신의 솔루션/프로젝트 이외의 폴더에 런타임에 필요한 모든 라이브러리를 수집 한 가정이, 당신은 단지에 이벤트를 포스트 구축하여 시도했다 :

내 사용자 정의 MyWebProj.wpp.targets

은 다음과 같습니다 이 모든 라이브러리를 주 프로젝트 대상 디렉토리 (bin)에 복사 한 다음 Sayeds 방법을 사용하여 배포 패키지에 해당 디렉토리를 포함 시키십시오 : http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx (이 게시물에서도 가능 : How do you include additional files using VS2010 web deployment packages?)?

내가 (다른 사람의 사이에서)가 내 주요 프로젝트의 빌드 후 이벤트에 다음 줄 :

xcopy "$(ProjectDir)..\..\Libraries\*.dll" "$(TargetDir)" /Y /S 

이 외에도, 내 .csproj 파일에 다음 행을 추가 한 :

<PropertyGroup> 
    <CopyAllFilesToSingleFolderForPackageDependsOn> 
    PostBuildLibraries; 
    $(CopyAllFilesToSingleFolderForPackageDependsOn); 
    </CopyAllFilesToSingleFolderForPackageDependsOn> 
</PropertyGroup> 
    <Target Name="PostBuildLibraries"> 
    <ItemGroup> 
    <_PostBuildLibraries Include="$(TargetDir)**\*" /> 
    <FilesForPackagingFromProject Include="%(_PostBuildLibraries.Identity)"> 
     <DestinationRelativePath>$(OutDir)%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    </ItemGroup> 
</Target> 

"Microsoft.WebApplication.targets"가져 오기 후에이 줄을 추가해야합니다. 자세한 내용은 위의 링크를 확인하십시오.

이렇게하면 각 빌드 (프로젝트의 대상 디렉토리에 복사) 후에 배포 패키지 (obj \ < 구성 > \ Package \ PackageTmp \ bin에 복사)를 만들 때마다 원하는 모든 라이브러리를 사용할 수 있습니다.

또한 내 솔루션이 아닌 내 프로젝트를 구축 중이므로 $(SolutionDir) 대신 $(ProjectDir) 매크로를 사용하고 있습니다.

관련 문제