我测试了在Visual Studio 2010中的新的网络包装的功能和整个地方我用一个预生成事件所需的.dll的复制到我的应用程序依赖于对API的调用我的bin文件夹的情况来了。 因为它们可以与互操作使用不COM DLL文件不能被包括作为参考。
当我建立我的部署包,当我选择的选项这些文件被排除在外,只包括运行应用程序所需的文件。 是否存在一种配置部署设置,包括这些文件的方法吗? 我有没有运气找到任何这良好的文档。
我测试了在Visual Studio 2010中的新的网络包装的功能和整个地方我用一个预生成事件所需的.dll的复制到我的应用程序依赖于对API的调用我的bin文件夹的情况来了。 因为它们可以与互操作使用不COM DLL文件不能被包括作为参考。
当我建立我的部署包,当我选择的选项这些文件被排除在外,只包括运行应用程序所需的文件。 是否存在一种配置部署设置,包括这些文件的方法吗? 我有没有运气找到任何这良好的文档。
大的问题。 我刚刚发布了关于这个非常详细的博客文章在Web部署工具(MSDeploy):构建套件,包括额外的文件或排除特定文件 。
这里是简介。 包括文件后,我将展示如何排除的文件。
包括附加文件
包括额外的文件到包是有点困难,但仍没有bigee如果你是舒服的MSBuild,如果你不是那么阅读。 为了做到这一点,我们需要挂接到收集的文件包装过程的一部分。 我们需要扩大目标被称为CopyAllFilesToSingleFolder。 这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以挖掘到并注入我们自己的目标。 因此,我们将创建一个名为目标和CustomCollectFiles注入到这一点的过程。 我们用下面的(记得import语句后)实现这一目标。
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
这将我们的目标添加到过程,现在我们需要定义目标本身。 让我们假设你有一个文件夹命名,它位于1级Web项目上面附加文件。 您要包括所有这些文件。 这里是CustomCollectFiles目标,之后我们讨论。
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
在这里我所做的是创建该项目_CustomFiles,并在包括属性告诉它捡起该文件夹中的所有文件和它下面的任何文件夹。 万一您需要从列表中排除的东西,添加Exclude
属性_CustomFiles
。
然后,我用这个项目来填充FilesForPackagingFromProject项目。 这是MSDeploy实际使用添加额外的文件的项目。 还要注意,我声明了元数据DestinationRelativePath值。 这将确定其将被放置在包装中的相对路径。 我这里使用的语句附加文件%(RecursiveDir)%(文件名)%(分机)。 那是什么意思是将其放置在相同的相对位置,在包装,因为它是多余的文件夹下。
排除文件
如果你打开VS 2010中朝着它的底部创建Web应用程序的项目文件,你会发现有一条线。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,你可以打开项目文件VS.内 右键单击该项目挑卸载项目。 然后右键点击卸载项目,然后选择编辑项目。
该声明将包括所有我们需要的目标和任务。 我们的大多数自定义的应该是导入后,如果您不知道,如果把后! 所以,如果你要排除的文件有一个项目名称,ExcludeFromPackageFiles,可以用来这样做。 例如,让我们说,你有文件名为Sample.Debug.js其中包括Web应用程序,但你想要的文件从创建的包被排除在外。 您可以将低于import语句后的片段。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充该项目的文件将自动被排除在外。 注意FromTarget元数据的使用在这里。 我不会进入这里,但你应该知道始终指定。
一个简单的办法是编辑的csproj文件,包括bin文件夹中需要的dll,然后创建一个beforebuild目标的项目,从我们存储我们的第三方的dll公用库文件夹复制到bin文件夹。 因为该项目在解决方案文件存在,它是由的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的建议,以隐藏从而消除可见的bin文件夹的以前的缺点的条目。 由我未经核实。
就像@toxaq,而是一个更简单的解决方法是:
在解决方案浏览所述文件添加作为链接到库/引用文件夹,然后在属性设置它被复制到构建的输出。
所以,赛义德的实现并没有为我工作。 我使用VS2013和使用Web部署包,并从另一个文件夹中添加一些插件的DLL到部署包的bin需要。 以下是我设法使它工作(很容易):
在您的csproj文件中添加的底部:
<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
<ItemGroup>
<Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />
</Target>
在文件的csproj其他mentionables:
<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" />
想发表评论我要强调上述周华健勒奇的评论。 如果您已经安装了一个Azure的SDK,然后寻找一个不同的DependencyProperty。
基本上,你可能需要使用“CopyAllFilesToSingleFolderForMsdeployDependsOn而不是‘CopyAllFilesToSingleFolderForPackageDependsOn’我不是一个真正的先进的MSBuild的家伙,我浪费时间拉我的头发试图确定为什么我的目标没有得到调用。
下面是如果这另一个链接不会为你工作,你已经安装了一个Azure的SDK: http://forums.iis.net/t/1190714.aspx
作为附录赛义德的回答,我发现ExcludeFromPackageFiles项目我的项目中的静态声明是不够的。 我需要排除是唯一可用的编译后 (当我部署到IIS不需要的Azure的具体Ninject模块)的某些DLL文件。
于是,我就在使用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>
希望可以帮助别人...