如何使用 VS2010 Web 部署包包含其他文件?

我正在测试使用新的网络包装功能在视觉工作室2010年,遇到了一个情况下,我使用预建事件,以复制所需的。Dll 进入了我的 bin 文件夹,我的应用程序依赖于该文件夹进行 API 调用。它们不能作为引用包括在内,因为它们不是可以与互操作一起使用的 COMdlls。

当我构建部署包时,当我选择只包含运行应用程序所需的文件时,这些文件被排除在外。是否有办法将部署设置配置为包含这些文件?我没有找到任何关于这个的好文件。

70146 次浏览

问得好,我刚在 Web 部署工具(MSDeploy) : 构建包含额外文件或排除特定文件的包上发布了一篇非常详细的博文。

下面是大纲。在包含文件之后,我也展示了如何排除文件。

包括额外的文件

包括额外的文件到软件包是有点困难,但仍然没有大家如果你是舒适的 MSBuild,如果你不然,阅读这一点。为了做到这一点,我们需要连接到收集用于打包的文件的流程部分。我们需要扩展的目标名为 CopyAllFilesToSingleFolder。此目标具有一个依赖项属性 PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它并注入自己的目标。因此,我们将创建一个名为 CustomCollectFiles 的目标,并将其注入到流程中。我们通过以下方法实现这一点(记住 import 语句之后)。

<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>


<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>

这将把我们的目标添加到流程中,现在我们需要定义目标本身。让我们假设您有一个名为“额外文件”的文件夹,位于 Web 项目之上1级。您需要包含所有这些文件。以下是 CustomCollectFiles 目标,我们将在此之后进行讨论。

<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />


<FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>

这里我所做的是创建 item _ CustomFiles,在 Include 属性中告诉它拾取该文件夹中的所有文件以及它下面的任何文件夹。如果您有任何机会需要 排除从该列表的东西,添加一个 Exclude属性到 _CustomFiles

然后使用该项填充 FilesForPackagingFromProject 项。这是 MSDeploy 实际用来添加额外文件的项。还要注意,我声明了元数据 DestinationRelativePath 值。这将确定它将被放置在包中的相对路径。我在这里使用了额外文件% (RecursiveDir)% (文件名)% (扩展名)语句。这意味着将它放置在包中与“额外文件”文件夹下相同的相对位置。

排除文件

如果你打开一个用 VS2010创建的 web 应用程序的项目文件,你会发现在它的底部有一行。

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

顺便说一下,你可以打开 VS 里面的项目文件,右键点击项目选择卸载项目。然后右键单击卸载的项目并选择 EditProject。

这个声明将包括我们需要的所有目标和任务。我们的大多数自定义应该在导入之后,如果你不确定放如果之后!因此,如果有要排除的文件,则可以使用项名 ExcludeFromPackageFiles 进行排除。例如,假设您有一个名为 Sample 的文件。它包含在你的 web 应用程序中,但是你希望这个文件被排除在创建的包之外。您可以将下面的代码片段放在 import 语句之后。

<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>

通过声明填充此项,将自动排除这些文件。请注意这里 FromTarget元数据的用法。我不会在这里讨论这个问题,但是你应该知道要始终指明这一点。

一个更简单的解决方案是编辑 csproj 文件,将所需的 dll 包含在 bin 文件夹中,然后创建一个 before build 目标,将项目从存储第三方 dll 的公共库文件夹复制到 bin 文件夹中。因为该项存在于解决方案文件中,所以它由 msbuild/msdepartment 部署,不需要任何复杂的东西。

标记用于包含文件而不通过 VS 添加(VS 通常希望将其添加到您的 VCS 中)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

这就是我曾经使用过的 Before Build 目标:

<Target Name="BeforeBuild">
<Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
<Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

编辑后包含@tuespetre 的建议,以隐藏条目,从而消除可见 bin 文件夹之前的缺点。未经我证实。

作为 Sayed 答案的附录,我发现在我的项目中对 ExcludeFromPackageFiles 项进行静态声明是不够的。我需要排除某些仅可用于 之后编译的 DLL (在部署到 IIS 时不需要的 Azure 特定 Nregister 模块)。

因此,我尝试使用上面发布的 CopyAllFilesToSingleFolderForPackageDependsOn 技巧生成 ExcludeFromPackageFiles 列表。但是,这为时已晚,因为打包过程已经删除了 ExcludeFromPackageFiles 项。所以,我用了同样的方法,但是更早一点:

<PropertyGroup>
<ExcludeFilesFromPackageDependsOn>
$(ExcludeFilesFromPackageDependsOn);
_ExcludeAzureDlls
</ExcludeFilesFromPackageDependsOn>
</PropertyGroup>


<Target Name="_ExcludeAzureDlls">
<ItemGroup>
<FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
Exclude="%(RootDir)%(Directory)*Azure*.dll" />
<AzureFiles Include="@(FilesForPackagingFromProject)"
Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
<ExcludeFromPackageFiles Include="@(AzureFiles)">
<FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
</Target>

希望这能帮到某人。

就像@toxaq 一样,但一个更简单的解决方案是:

在解决方案资源管理器中,将该文件作为链接添加到库/引用文件夹,然后在属性中设置将其复制到生成的输出。

想要评论以强调埃米尔 · 勒奇上面的评论。如果您已经安装了 Azure SDK,那么请查找不同的 DependencyProperty。

基本上,您可能需要使用“ CopyAllFilesToSingleFolderForMsloyDependsOn”而不是“ CopyAllFilesToSingleFolderForPackageDependsOn”。我真的不是一个先进的 MsBuild 家伙和我浪费了几个小时拉我的头发试图确定为什么我的目标没有得到呼叫。

这里是另一个链接,如果这不适合你,你已经安装了一个 Azure SDK: 译自: 美国《 http://forums.iis.net/t/1190714.aspx 》杂志网站(http://forums.iis.net/t/1190714.aspx)

所以 Sayed 的实现对我来说不起作用。我正在使用 VS2013和 Web Deploy 包,需要从另一个文件夹将一些插件 DLL 添加到部署包的文件夹中。下面是我是如何让它工作起来(容易得多)的:

在 csproj 文件的底部添加:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
<ItemGroup>
<Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />
</Target>

Csproj 文件中提到的其他内容:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DeployOnBuild>true</DeployOnBuild>
<DeployTarget>Package</DeployTarget>
<DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
<DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
<FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
<ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
<PublishDatabases>false</PublishDatabases>
</PropertyGroup>


<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

此外,还可以将文件设置为 Content | Copy always

Also, it is possible to set the file as Content | Copy always