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

我正在使用Visual Studio 2010中的新Web包装功能进行测试,并遇到了一种情况,我使用预生成事件将所需的.dll复制到我的应用依赖API进行调用的bin文件夹中。 由于它们不是可以与interop一起使用的COM DLL,因此它们不能作为参考。

当我构建我的部署包时,当我选择仅包含运行该应用程序所需的文件的选项时,将排除这些文件。 有没有办法配置部署设置以包含这些文件? 我没有找到任何好的文档。


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

这是简介。 包含文件后,我还会演示如何排除文件。

包括额外的文件

如果你对MSBuild感到满意,并且如果你没有阅读过,那么将更多的文件包含到软件包中有点困难,但仍然没有bigee。 为了做到这一点,我们需要勾选收集文件进行打包的部分。 我们需要扩展的目标称为CopyAllFilesToSingleFolder。 该目标具有一个依赖项属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它来注入我们自己的目标。 所以我们将创建一个名为CustomCollectFiles的目标并将其注入进程。 我们通过以下方式实现此目的(请在导入声明之后记住)。

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

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

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

排除文件

如果您打开使用VS 2010创建的Web应用程序的项目文件并将其放在其底部,您会发现一行。

<Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.WebApplication.targets" />

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

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

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

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


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

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

<Content Include="Bin3rdPartyNative.dll" ><Visible>false</Visible></Content>

这是为我工作的BeforeBuild目标:

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

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


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

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

链接地址: http://www.djcxy.com/p/81613.html

上一篇: How do you include additional files using VS2010 web deployment packages?

下一篇: One click publishing, web deploy, problem with non dll files