我正在尝试基于Jenkins的Web应用程序(.NET 4.0)的自动构建/部署。 Web应用程序项目有几个项目引用,而这些引用又具有二进制引用第三方DLL。
问题:
obj\<CONFIGURATION>\Package\PackageTmp\bin
文件夹中的bin文件夹,用于构建部署包。 PackageTmp\bin
目录。MS已将此确认为“未解决问题”here。
相关问题here,here和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 =假
我尝试手动编辑项目文件中的参考元素,添加<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>
答案 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)
。