使用MSBuild Web部署缺少二级二进制引用

时间:2012-03-07 20:52:04

标签: reference msbuild web-deployment

我正在尝试基于Jenkins的Web应用程序(.NET 4.0)的自动构建/部署。 Web应用程序项目有几个项目引用,而这些引用又具有二进制引用第三方DLL。

问题:

  1. 第二级引用(项目引用的引用)不会被拉入obj\<CONFIGURATION>\Package\PackageTmp\bin文件夹中的bin文件夹,用于构建部署包。
  2. 当我在visual studio中构建时,第二级引用被拉入常规构建输出目录。
  3. 使用MSBuild构建时,第二级依赖项不会被拉入常规输出目录,也不会被引入PackageTmp\bin目录。
  4. MS已将此确认为“未解决问题”here

    相关问题hereherehere要么与我的问题不符,要么提供不起作用的解决方案。我已经回顾了所有答案,而不仅仅是已接受的答案。

    我的构建命令如下所示(使用MSBuild 4.0):

      

    MSBuild MySolution.sln / p:Configuration = Integration / p:platform =“Any   CPU“/ t:Clean,Build / p:DeployOnBuild = true / p:DeployTarget = Package   / P:AutoParameterizationWebConfigConnectionStrings =假

    我尝试手动编辑项目文件中的参考元素,添加<Private>True</Private>,但没有成功。

    我正在尝试解决这个已知问题,以便我的第二级依赖项自动正确地拉入Web发布临时目录。

    我当前的尝试结合了一般方法here(通过在Web项目文件旁边添加MyProject.wpp.targets文件来自定义Web发布管道),并结合一些用于查找DLL的MSBuild代码{{3} }。到目前为止,这已经没有产生任何结果或破坏了项目文件。我是自定义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>
    

1 个答案:

答案 0 :(得分: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 \ _&lt; CONFIGURATION&gt; \ Package \ PackageTmp \ bin)。

此外,由于我正在构建我的主项目,而不是我的解决方案,因此我使用的是$(ProjectDir)宏,而不是$(SolutionDir)