2012-03-07 12 views
4

Webアプリケーション(.NET 4.0)のJenkinsベースの自動ビルド/デプロイメントを実行しようとしています。 Webアプリケーションプロジェクトには、複数のプロジェクト参照があり、順番にバイナリ参照サードパーティDLLを参照します。MSBuild Webデプロイメントで第2レベルのバイナリリファレンスが見つからない

問題:

  1. セカンドレベルの参照(プロジェクト参照の参照は)展開パッケージを構築するために使用obj\<CONFIGURATION>\Package\PackageTmp\binフォルダにbinフォルダに引き込まれていません。
  2. ビジュアルスタジオでビルドすると、2番目のレベルの参照が通常のビルド出力ディレクトリに引き込まれます。
  3. MSBuildを使用して構築する場合、2番目のレベルの依存関係は、通常の出力ディレクトリまたはPackageTmp\binディレクトリには引き込まれません。

これは、MSによってWon't-Fixの問題hereとして確認されています。

関連する質問herehereおよびhereは、私の問題と一致しないか、動作しないソリューションを提供しています。私は受け入れられたものだけでなく、すべての答えを見直しました。

私のビルドコマンドは、この(のMSBuild 4.0を使用して)次のようになります。/ Pを構築し、クリーン:

MSBuildのMySolution.sln/P:設定=統合/ P:プラットフォーム= "どれ CPU" /トン:DeployOnBuild = TRUE/P:DeployTarget =パッケージ /P:私は手動でプロジェクトファイル内の参照要素を編集しようとした

AutoParameterizationWebConfigConnectionStrings = falseの場合、成功しません、<Private>True</Private>を追加します。

私はこの既知の問題を回避しようとしています。そのため、第2レベルの依存関係が自動的にWeb公開の一時ディレクトリにプルされます。

私の現在の試みは、DLLをhereを見つけるためのいくつかのMSBuildのコードと組み合わせて、(MyProject.wpp.targetsは、次のWebプロジェクトファイルへのファイル追加することにより、Webパブリッシングパイプラインをカスタマイズする)は、一般的なアプローチhereを兼ね備えています。これまでのところ、結果は生成されなかったか、プロジェクトファイルが壊れていました。私はMSBuildのカスタムコードを初めて習得し、それをかなりわかりやすく見つけます。

私の質問:私は、私の特定のケースで動作するより完全な例を探しています。 I 目的は、パッケージtempディレクトリにコピーするためのファイルを収集し、それに第2レベルの依存関係を追加するWeb公開パイプラインに介入することです。

マイカスタムMyWebProj.wpp.targetsは次のようになります。あなたはあなたのソリューション/プロジェクト外のフォルダ内の実行時に必要なすべてのライブラリを収集していると仮定すると、

<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

、あなただけにビルド後のイベントを使用して試してみましたこれらすべてのライブラリをメインプロジェクトのターゲットディレクトリ(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)マクロを使用しています。

関連する問題