【问题标题】:Missing Second-Level Binary References with MSBuild Web DeploymentMSBuild Web 部署缺少二级二进制引用
【发布时间】:2012-03-07 20:52:03
【问题描述】:

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

问题:

  1. 二级引用(项目引用的引用)未拉入obj\<CONFIGURATION>\Package\PackageTmp\bin文件夹下的bin文件夹,用于构建部署包。
  2. 当我在 Visual Studio 中构建时,二级引用被拉到常规构建输出目录中。
  3. 使用 MSBuild 构建时,不会将二级依赖项拉入常规输出目录,也不会拉入 PackageTmp\bin 目录。

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=false

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

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

我目前的尝试结合了通用方法here(通过在 Web 项目文件旁边添加 MyProject.wpp.targets 文件来自定义 Web 发布管道),并结合了一些用于查找 DLL 的 MSBuild 代码here。到目前为止,这要么没有产生任何结果,要么破坏了项目文件。我是自定义 MSBuild 代码的新手,发现它非常神秘。

我的问题:我正在寻找一个更完整的示例,适用于我的具体情况。我认为的目标是干预网络发布管道,该管道收集文件以复制到包临时目录,并向其中添加二级依赖项。

我的自定义 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>

【问题讨论】:

    标签: reference msbuild web-deployment


    【解决方案1】:

    假设您已在解决方案/项目之外的文件夹中收集了运行时所需的所有库,您是否尝试过仅使用构建后事件将所有这些库复制到您的主项目目标目录 (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)后,所有所需的库都可​​用。

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

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多