我目前正在尝试使用Visual Studio 2010“发布”和MSDeploy功能来处理我的Web部署需求,但在根据我的生成配置自定义包方面遇到了障碍。我在32位环境中开发,但需要为64位环境创建发布包,因此在“发布”配置中,我有一个生成后事件,它将第三方dll的64位版本复制到bin目录,覆盖32位版本。当我使用“发布”功能时,即使正确的64位dll被复制到bin目录,它不会包含在软件包中。是否有方法让'Publish'包含在建置后事件期间复制到bin目录的档案?
eit6fx6z1#
我在How do you include additional files using VS2010 web deployment packages?回答了一个类似但不同的问题。在您使用生成后事件的场景中,我建议您删除生成后事件,并使用您自己的MSBuild目标而不是生成后事件来实现您的操作。下面是另一个答案的文本。
发件人:How do you include additional files using VS2010 web deployment packages?
很好的问题。我刚刚在Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files上发布了一个关于这个问题的非常详细的博客条目。这里是概要。在包括文件之后,我也展示了如何排除文件。
包括额外文件
将额外的文件包含到包中有点困难,但如果您熟悉MSBuild,则仍然没有问题,如果您不熟悉,则请阅读本文。为此,我们需要挂钩到收集要打包的文件的进程部分。我们需要扩展的目标称为CopyAllFilesToSingleFolder。此目标具有依赖属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,因此我们将创建一个名为CustomCollectFiles的目标,并将其注入到进程中。
CopyAllFilesToSingleFolder
PipelinePreDeployCopyAllFilesToOneFolderDependsOn
CustomCollectFiles
<PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn); </CopyAllFilesToSingleFolderForPackageDependsOn> </PropertyGroup>
这将把我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为Extra Files的文件夹,它位于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项,并在Include属性中告诉它选取该文件夹及其下的任何文件夹中的所有文件。然后,我使用此项填充FilesForPackagingFromProject项。MSDeploy实际上使用此项来添加额外的文件。还要注意,我声明了元数据DestinationRelativePath值。这将决定它将被放置在包中的相对路径。我在这里使用了Extra Files%(RecursiveDir)%(Filename)%(Extension)语句。这意味着将它放置在包中与Extra Files文件夹下相同的相对位置。
_CustomFiles
FilesForPackagingFromProject
DestinationRelativePath
Files%(RecursiveDir)%(Filename)%(Extension)
排除档案
如果您打开使用VS 2010创建的Web应用程序的项目文件,在项目文件的底部,您会发现一行带有。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,你可以在VS中打开项目文件。右键单击项目,选择“卸载项目”。然后右键单击卸载的项目,选择“编辑项目”。此语句将包括我们需要的所有目标和任务。如果您不确定是否将if放在导入之后,则大多数定制都应在导入之后进行!因此,如果您要排除某些文件,则需要有一个项名称ExcludeFromPackageFiles,例如,假设您有一个名为Sample. Debug文件js,但您希望从创建的包中排除该文件。您可以将下面的代码片段放在该import语句之后。
ExcludeFromPackageFiles
<ItemGroup> <ExcludeFromPackageFiles Include="Sample.Debug.xml"> <FromTarget>Project</FromTarget> </ExcludeFromPackageFiles> </ItemGroup>
通过声明填充此项,文件将被自动排除。注意这里FromTarget元数据的用法。我不会在这里讨论它,但你应该知道总是指定它。
FromTarget
s3fp2yjn2#
我通过使用项目文件中的ExcludeFilesFromDeployment元素找到了解决这个问题的方法。因此,如果您需要在成功建置和相关的建置后步骤之后,将项目档案封装为项目目录中的档案,请执行下列动作。1.编辑“打包/发布Web”项目设置并选择要部署为“此项目文件夹中的所有文件”的项1.卸载项目1.右键单击已卸载的项目,然后选择编辑项目配置1.找到与配置设置(例如“Release”)关联的PropertyGroup元素1.在PropertyGroup元素中添加以下元素,并排除不需要的文件和文件夹
ExcludeFilesFromDeployment
PropertyGroup
<ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
1.保存并重新加载项目这暂时解决了我的问题,但如果有更好的解决方案,请让我知道,因为这是不理想的,由于涉及黑客,但话又说回来,也许这是一个不常见的部署场景?
xj3cbfub3#
选择您文件或文件夹,然后从.属性.窗口中将.更改生成.操作作为内容
daupos2t4#
我知道这是个老问题,但这些都不对我起作用。在2017 VS我只是右键点击额外的文件夹要发布,并选择发布它的工作.
范例:
camsedfj5#
将bin文件夹(及其内容)添加到项目导致文件被复制到发布输出目录。
对我来说,我的问题是我需要在bin/文件夹中放置专有软件许可证文件,但不想在每次部署时手动复制它。这是使用Visual Studio 2015专业版
mzsu5hc06#
我知道这是一个古老的对话,但我偶然发现它,而试图做同样的事情,我认为这将是有帮助的补充我在这里发现。几乎所有关于在出版物中包含额外文件的文章都使用这种方法,即在PropertyGroup中添加CopyAllFilesToSingleFolderForPackageDependsOn或CopyAllFilesToSingleFolderForMSDeployDependsOn项目,它们都类似于“我将此添加到文件末尾...”这就是我所做的,我花了一个下午试图找到为什么什么都没有发生,直到我意识到在文件的顶部已经有一个PropertyGroup部分。当我把我的CopyAllFilesToSingleFolderForPackageDependsOn放进那个部分时,它工作得很好。希望有一天这能节省一些人的时间
CopyAllFilesToSingleFolderForPackageDependsOn
CopyAllFilesToSingleFolderForMSDeployDependsOn
6条答案
按热度按时间eit6fx6z1#
我在How do you include additional files using VS2010 web deployment packages?回答了一个类似但不同的问题。
在您使用生成后事件的场景中,我建议您删除生成后事件,并使用您自己的MSBuild目标而不是生成后事件来实现您的操作。下面是另一个答案的文本。
发件人:How do you include additional files using VS2010 web deployment packages?
很好的问题。我刚刚在Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files上发布了一个关于这个问题的非常详细的博客条目。
这里是概要。在包括文件之后,我也展示了如何排除文件。
包括额外文件
将额外的文件包含到包中有点困难,但如果您熟悉MSBuild,则仍然没有问题,如果您不熟悉,则请阅读本文。为此,我们需要挂钩到收集要打包的文件的进程部分。我们需要扩展的目标称为
CopyAllFilesToSingleFolder
。此目标具有依赖属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn
,因此我们将创建一个名为CustomCollectFiles
的目标,并将其注入到进程中。这将把我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为Extra Files的文件夹,它位于Web项目的上一级。您希望包含所有这些文件。下面是
CustomCollectFiles
目标,我们将在后面讨论。在这里,我创建了
_CustomFiles
项,并在Include属性中告诉它选取该文件夹及其下的任何文件夹中的所有文件。然后,我使用此项填充FilesForPackagingFromProject
项。MSDeploy实际上使用此项来添加额外的文件。还要注意,我声明了元数据DestinationRelativePath
值。这将决定它将被放置在包中的相对路径。我在这里使用了ExtraFiles%(RecursiveDir)%(Filename)%(Extension)
语句。这意味着将它放置在包中与Extra Files文件夹下相同的相对位置。排除档案
如果您打开使用VS 2010创建的Web应用程序的项目文件,在项目文件的底部,您会发现一行带有。
顺便说一句,你可以在VS中打开项目文件。右键单击项目,选择“卸载项目”。然后右键单击卸载的项目,选择“编辑项目”。
此语句将包括我们需要的所有目标和任务。如果您不确定是否将if放在导入之后,则大多数定制都应在导入之后进行!因此,如果您要排除某些文件,则需要有一个项名称
ExcludeFromPackageFiles
,例如,假设您有一个名为Sample. Debug文件js,但您希望从创建的包中排除该文件。您可以将下面的代码片段放在该import语句之后。通过声明填充此项,文件将被自动排除。注意这里
FromTarget
元数据的用法。我不会在这里讨论它,但你应该知道总是指定它。s3fp2yjn2#
我通过使用项目文件中的
ExcludeFilesFromDeployment
元素找到了解决这个问题的方法。因此,如果您需要在成功建置和相关的建置后步骤之后,将项目档案封装为项目目录中的档案,请执行下列动作。
1.编辑“打包/发布Web”项目设置并
选择要部署为“此项目文件夹中的所有文件”的项
1.卸载项目
1.右键单击已卸载的项目,然后选择编辑项目配置
1.找到与配置设置(例如“Release”)关联的
PropertyGroup
元素1.在
PropertyGroup
元素中添加以下元素,并排除不需要的文件和文件夹1.保存并重新加载项目
这暂时解决了我的问题,但如果有更好的解决方案,请让我知道,因为这是不理想的,由于涉及黑客,但话又说回来,也许这是一个不常见的部署场景?
xj3cbfub3#
选择您文件或文件夹,然后从.属性.窗口中将.更改生成.操作作为内容
daupos2t4#
我知道这是个老问题,但这些都不对我起作用。
在2017 VS我只是右键点击额外的文件夹要发布,并选择发布它的工作.
范例:
camsedfj5#
将bin文件夹(及其内容)添加到项目导致文件被复制到发布输出目录。
对我来说,我的问题是我需要在bin/文件夹中放置专有软件许可证文件,但不想在每次部署时手动复制它。
这是使用Visual Studio 2015专业版
mzsu5hc06#
我知道这是一个古老的对话,但我偶然发现它,而试图做同样的事情,我认为这将是有帮助的补充我在这里发现。
几乎所有关于在出版物中包含额外文件的文章都使用这种方法,即在
PropertyGroup
中添加CopyAllFilesToSingleFolderForPackageDependsOn
或CopyAllFilesToSingleFolderForMSDeployDependsOn
项目,它们都类似于“我将此添加到文件末尾...”这就是我所做的,我花了一个下午试图找到为什么什么都没有发生,直到我意识到在文件的顶部已经有一个
PropertyGroup
部分。当我把我的CopyAllFilesToSingleFolderForPackageDependsOn
放进那个部分时,它工作得很好。希望有一天这能节省一些人的时间