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

我在Visual Studio 2010中使用新的Web包装function进行testing,发现使用预生成事件将需要的.dll复制到我的应用程序依赖的用于API调用的bin文件夹中。 它们不能作为参考,因为它们不是可以与interop一起使用的COM DLL。

当我构build我的部署包时,我select仅包含运行应用程序所需的文件的选项将排除这些文件。 有没有办法configuration部署设置来包含这些文件? 我没有find任何好的文件。

伟大的问题。 我只是在Web部署工具(MSDeploy)上发布了一个非常详细的博客文章:包含额外文件或排除特定文件的构build包 。

这里是大纲。 包含文件之后,我还展示了如何排除文件。

包括额外的文件

如果你对MSBuild感到满意,包括额外的文件到软件包中有点困难,但是如果你没有阅读, 为了做到这一点,我们需要勾选收集文件进行打包的部分。 我们需要扩展的目标称为CopyAllFilesToSingleFolder。 这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以挖掘并注入我们自己的目标。 所以我们将创build一个名为CustomCollectFiles的目标并将其注入进程。 我们用下面的方法实现这个(在import语句之后记得)。

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

这将把我们的目标join到这个过程中,现在我们需要定义目标本身。 假设您有一个名为额外文件的文件夹,位于您的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> 

在这里我做的是创build项目_CustomFiles,并在包含属性告诉它拿起该文件夹中的所有文件和它下面的任何文件夹。 如果有任何机会,您需要从列表中排除某些内容,请将“ Exclude属性添加到_CustomFiles

然后我使用这个项目来填充FilesForPackagingFromProject项目。 这是MSDeploy实际用于添加额外文件的项目。 另外请注意,我声明了元数据DestinationRelativePath的值。 这将决定它将被放置在包中的相对path。 我在这里使用了Extra Files%(RecursiveDir)%(Filename)%(Extension)语句。 这是说,将它放在包中的相同的相对位置,因为它在Extra文件夹下。

排除文件

如果您打开VS 2010创build的Web应用程序的项目文件,则会find一行。

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

顺便说一句,你可以打开VS中的项目文件。 右键单击项目select卸载项目。 然后右键单击卸载的项目,然后select编辑项目。

这个声明将包括我们需要的所有目标和任务。 我们大多数的自定义应该在导入之后,如果你不确定放在后面的话! 因此,如果您有要排除的文件,则可以使用项目名称ExcludeFromPackageFiles来执行此操作。 例如,假设您的Web应用程序中包含名为Sample.Debug.js的文件,但是您希望将该文件从创build的包中排除。 您可以在该导入语句之后放置下面的代码片段。

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

通过声明填充这个项目,文件将被自动排除。 请注意这里使用FromTarget元数据。 我不会在这里进入,但你应该知道总是指定。

一个更简单的解决scheme是编辑csproj文件,将所需的dll包含在bin文件夹中,然后创build一个beforebuild目标,将该项目从我们存储第三方dll的公用库文件夹复制到bin文件夹中。 由于该项目存在于解决scheme文件中,因此它由msbuild / msdeploy部署,不需要任何复杂的工作。

标签用于包含文件,而不通过VS添加(通常将其添加到您的VCS)

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

这是为我工作的BeforeBuild目标:

 <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的build议隐藏条目,从而消除了可见的bin文件夹的以前的缺点。 未经我证实。

就像@toxaq,但更简单的解决scheme是:

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

想要评论以强调Emil Lerch上面的评论。 如果您已经安装了Azure SDK,请查找其他DependencyProperty。

基本上,你可能需要使用“CopyAllFilesToSingleFolderForMsdeployDependsOn”而不是“CopyAllFilesToSingleFolderForPackageDependsOn”。我不是一个真正的高级MsBuild的家伙,我浪费了几个小时拉我的头发,试图确定为什么我的目标没有被调用。

这是另一个链接,如果这不适合你,你已经安装了一个Azure SDK: http : //forums.iis.net/t/1190714.aspx

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

所以我试着用上面提到的CopyAllFilesToSingleFolderForPackageDependsOn trick Say来生成我的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> 

希望能帮助别人…

所以Sayed的实施并不适合我。 我正在使用VS2013并使用Web Deploy软件包,并需要将其他文件夹中的一些插件DLL添加到部署软件包的bin中。 以下是我如何使其工作(更容易):

在你的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" />