如何使用VS2010 Web部署软件包包含其他文件?
-
02-10-2019 - |
题
我正在使用Visual Studio 2010中使用新的Web包装功能进行测试,并遇到了一个情况,我使用预构建事件将所需的.dll复制到我的bin文件夹中,我的应用程序依赖于API调用。它们不能作为参考包括在内,因为它们不是可以与Interop一起使用的com dll。
当我构建部署软件包时,当我选择仅包括运行应用所需的文件时,将排除这些文件。有没有办法配置部署设置以包含这些文件?我没有运气找到任何好的文档。
解决方案
好问题。我刚刚发布了一个非常详细的博客条目 Web部署工具(MSDEPLOY):构建包含额外文件或排除特定文件的软件包.
这是概要。包含文件后,我也显示如何排除文件。
包括额外的文件
将额外的文件包含在包装中有点困难,但是如果您对MSBUILD感到满意,那么仍然不会读书,如果您没有阅读此内容。为此,我们需要将收集包装文件的过程的一部分挂钩。我们需要扩展的目标称为CopyAllFilestosingLefolder。该目标具有依赖性属性,PipelineProdeDeployCopyAllfilestoOneFolderDependson,我们可以利用并注入自己的目标。因此,我们将创建一个名为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,并在Incluph属性中告诉它,它将该文件夹中的所有文件和下面的任何文件夹中拾取所有文件。如果有机会,您需要 排除 该列表中的某些内容,添加 Exclude
属性为 _CustomFiles
.
然后,我使用此项目填充FilesForpackagingFromproject项目。这是MSDeploy实际用来添加额外文件的项目。另请注意,我宣布了元数据目的地的路径值。这将确定将其放置在包装中的相对路径。我在此处使用了语句Extra Files%(recursiveir)%(FILENAME)%(扩展名)。这是要将其放在包装中与额外文件文件夹下方相同的相对位置的位置。
排除文件
如果您打开了使用VS 2010创建的Web应用程序的项目文件,则可以找到与之的线路。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,您可以打开VS内的项目文件。右键单击项目选择卸载项目。然后右键单击卸载项目,然后选择“编辑项目”。
该声明将包括我们需要的所有目标和任务。如果您不确定在此之后,我们的大多数自定义都应该是在该导入之后进行的!因此,如果您的文件排除在外,则可以使用一个项目名称,即排除frompackagefiles。例如,假设您的文件名为sample.debug.js,其中包含在您的Web应用程序中,但您希望该文件从创建的软件包中排除。您可以在该导入语句之后将摘要放在下面。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项目,文件将自动排除。在此处注意使用FromTarget Metadata的用法。我不会在这里介绍这一点,但是您应该知道始终指定这一点。
其他提示
一个简单的解决方案是编辑CSPROJ文件,以在bin文件夹中包含所需的dll,然后创建一个前构建目标,以将项目从公共库文件夹中复制到bin文件夹中,我们在其中存储了第三方DLL。由于该项目存在于解决方案文件中,因此由MSBUILD/MSDEPLOY部署,不需要复杂的内容。
标签用于包含文件而无需添加VS(通常需要将其添加到VCS))
<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>
这是对我有用的前建筑目标:
<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的建议,以隐藏条目,从而删除了可见垃圾箱文件夹的先前缺点。我没有得到我的验证。
就像@toxaq一样,但更简单的解决方案是:
在解决方案资源管理器中,将文件添加为指向库/引用文件夹的链接,然后在属性中将其设置为复制到构建的输出。
因此,赛义德的实施对我不起作用。我正在使用VS2013并使用Web部署软件包,需要将其他文件夹中的一些插件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" />
想评论以强调上面的埃米尔·勒奇(Emil Lerch)的评论。如果您已经安装了Azure SDK,请寻找不同的依赖项。
基本上,您可能需要使用“ CopyAllfilestosinglefolderformsdeploydependson,而不是“ CopyAllFilestospingLefolderPackagedson”。我并不是一个真正的高级MSBUILD家伙,我浪费了几个小时,试图将我的头发拉出,试图确定为什么我的目标没有被打来。
如果这对您不起作用,并且您已经安装了Azure SDK:这是另一个链接: http://forums.iis.net/t/1190714.aspx
作为Sayed答案的附录,我发现我项目中的静态声明不够。我需要排除某些仅可用的DLL 后 编译(我部署到IIS时不需要的Azure特定的NINEXT模块)。
因此,我尝试使用上面发布的copyallFilestosinglefolderPackagedson tricked使用copyAllfilestosinglefolderPackagedson tricked来生成我的DorkudeFrompackageFiles列表。但是,这为时已晚,因为包装过程已经删除了排除FrompackageFiles项目。因此,我使用了相同的技术,但更早了:
<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>
希望帮助某人...