2012-03-07 43 views
4

我正在嘗試做一個基於Jenkins的自動構建/部署的Web應用程序(.NET 4.0)。 Web應用程序項目具有多個項目引用,這些引用又具有二進制引用第三方DLL。MSBuild Web部署缺少二級二進制引用

問題:

  1. 第二級引用(項目引用的參考文獻)未在obj\<CONFIGURATION>\Package\PackageTmp\bin文件夾拖入bin文件夾,用於構建部署包。
  2. 當我在visual studio中構建時,第二級引用被拉入常規構建輸出目錄。
  3. 使用MSBuild構建時,二級依賴關係不會被拉入常規輸出目錄,也不會被拉入PackageTmp\bin目錄。

這被MS確認爲Won't-Fix問題here

相關問題here,herehere要麼不符合我的問題,要麼提供的解決方案不起作用。我已經回顧了所有的答案,而不僅僅是接受的答案。

我的生成命令看起來像這樣(使用的MSBuild 4.0):

的MSBuild MySolution.sln/P:配置=積分/ P:平臺= 「任何 CPU」/ T:清潔,構建/ P :DeployOnBuild = TRUE/p:DeployTarget =封裝 /p:AutoParameterizationWebConfigConnectionStrings =假

我試圖手動編輯項目文件參考元素,添加<Private>True</Private>,沒有成功。

我正在嘗試解決這個已知問題,以便我的第二級依賴關係自動並正確地拉入到Web發佈臨時目錄中。

我當前的嘗試結合了一般方法here(通過在Web項目文件旁邊添加一個MyProject.wpp.targets文件來定製Web發佈管道),並結合了一些用於查找DLL的MSBuild代碼here。到目前爲止,這已經沒有產生任何結果,或者破壞了項目文件。我是新來的自定義MSBuild代碼,並發現它非常神祕。

我的問題:我正在尋找一個更完整的例子,在我的具體情況。我想認爲的目標是介入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的\ <配置> \包\ PackageTmp \ BIN)時所有需要的庫和。

另外,由於我正在構建我的主項目,而不是我的解決方案,因此我使用的是宏$(ProjectDir)而不是$(SolutionDir)

相關問題