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

4
我正在尝试使用Jenkins进行基于.NET 4.0的Web应用程序的自动构建/部署。Web应用程序项目具有多个项目引用,这些引用又具有第三方DLL的二进制引用。
问题如下:
1. 二级引用(项目引用的引用)未被拉入用于构建部署包的obj\\Package\PackageTmp\bin文件夹中的bin文件夹中。 2. 当我在Visual Studio中构建时,二级引用被拉入常规构建输出目录中。 3. 使用MSBuild构建时,二级依赖项既未被拉入常规输出目录中,也未被拉入PackageTmp\bin目录中。
根据Microsoft的确认,这是一个不会修复的问题here

相关问题这里, 这里这里要么与我的问题不匹配,要么提供的解决方案不起作用。我已经查看了所有答案,而不仅仅是被接受的答案。

我的构建命令如下(使用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

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

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

我的当前尝试结合了通用方法here(通过在网站项目文件旁边添加MyProject.wpp.targets文件来自定义Web发布流程),以及一些MSBuild代码来查找DLLhere。到目前为止,这要么没有产生结果,要么破坏了项目文件。我对自定义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
假设您已经在解决方案/项目之外的文件夹中收集了所有运行时所需的库,请尝试使用后期构建事件将所有这些库复制到主项目目标目录(bin),然后使用 Sayed 的方法将该目录包含在部署包中: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\<CONFIGURATION>\Package\PackageTmp\bin)。
另外,由于我正在构建我的主要项目,而不是解决方案,因此我使用 $(ProjectDir) 宏代替 $(SolutionDir)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接