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

Jas*_*son 124 visual-studio-2010 web-deployment msdeploy visual-studio

我正在使用visual studio 2010中的新网络打包功能进行测试,并遇到了一种情况,我使用预构建事件将所需的.dll复制到我的应用程序依赖于API调用的bin文件夹中.它们不能作为参考包含在内,因为它们不是可与interop一起使用的COM dll.

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

Say*_*imi 171

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

这是概要.包含文件后,我将展示如何排除文件.

包括额外文件

包括额外的文件到包是有点困难,但仍没有bigee如果你是舒服的MSBuild,如果你不是那么阅读.为了做到这一点,我们需要挂钩收集文件以进行打包的过程部分.我们需要扩展的目标称为CopyAllFilesToSingleFolder.这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它来注入我们自己的目标.因此,我们将创建一个名为CustomCollectFiles的目标,并将其注入到流程中.我们通过以下方式实现此目的(请记住import语句之后).

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

  <CopyAllFilesToSingleFolderForMsdeployDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
  </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这会将我们的目标添加到流程中,现在我们需要定义目标本身.假设您有一个名为Extra Files的文件夹,它位于您的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>
Run Code Online (Sandbox Code Playgroud)

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

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

排除文件

如果您打开使用VS 2010创建的Web应用程序的项目文件,则会在其底部找到一行.

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

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

该声明将包括我们需要的所有目标和任务.我们的大多数自定义都应该在导入之后,如果您不确定是否放在后面!因此,如果您要排除文件,则可以使用项目名称ExcludeFromPackageFiles来执行此操作.例如,让我们说,你有文件名为Sample.Debug.js其中包括Web应用程序,但你想要的文件从创建的包被排除在外.您可以在导入语句后面放置代码段.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

通过声明填充此项目,将自动排除文件.请注意此处使用FromTarget元数据.我不会在这里讨论,但你应该知道总是指明这一点.

  • @SayedIbrahimHashimi和co.已经在[asp.net网站]上创建了更多最新版本的指南(http://www.asp.net/mvc/tutorials/deployment/visual-studio-web-deployment/deploying-extra -files).我强烈推荐这个链接,因为这是我在修改csproj文件而不是pubxml文件之间的区别. (8认同)
  • 我安装了VS2012(RC),对我来说有一个不同的DependencyProperty.为了支持混合团队(和我们的构建服务器),我使用了原始的CopyAllFilesToSingleFolderForPackageDependsOn配置**和**使用DependencyProperty CopyAllFilesToSingleFolderForMsdeployDependsOn重复 (7认同)
  • 这对我来说似乎不起作用.我正在使用VStudio 2013. :(上面的msbuild设置是否适合2013年? (5认同)
  • 您是否可以扩展您的示例以将其他项目输出包含在发布中? (3认同)
  • 这很棒.使用它来部署存储在txt文件中的某些版本信息. (2认同)

tox*_*xaq 21

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

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

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>
Run Code Online (Sandbox Code Playgroud)

这是适合我的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>
Run Code Online (Sandbox Code Playgroud)

编辑包括@ tuespetre建议隐藏条目,从而删除可见bin文件夹的先前缺点.我未经证实.

  • @toxaq,我可能会遗漏一些东西,但我遇到的问题是我实际上*需要*部署包中位于bin文件夹中***的位置中的文件.所以,是的,您可以将文件从任何位置复制到bin文件夹,但它们不会包含在该场景中部署包中的正确位置.为了它的价值,我遇到的情况是使用ClearScript.V8项目 - 本机.dll必须*不*出现在bin目录中,但必须出现在其父目录中 - 请参阅http://clearscript.codeplex.com/讨论/ 438696供讨论. (5认同)
  • "简约是最终的成熟" (3认同)
  • 如果可以的话,我会再投票十次.这应该是公认的答案.我还想补充一点,你可以设置`<Visible> false </ Visible>`来从解决方案资源管理器中隐藏它. (3认同)

egl*_*ius 7

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

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

  • -1这假设项目希望具有明确的链接器 - 时间关系.不适合插入式系统 (2认同)

K0D*_*0D4 6

所以赛义德的实施并不适合我.我正在使用VS2013并使用Web Deploy包,需要将另一个文件夹中的一些插件DLL添加到deploy包的bin中.以下是我设法让它工作的方式(更容易):

在csproj文件的底部添加:

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

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" />
Run Code Online (Sandbox Code Playgroud)


Pau*_*der 5

想发表评论,强调Emil Lerch上面的评论.如果已安装Azure SDK,则查找其他DependencyProperty.

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

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