我有VS2010创建,现在正在使用VS2012访问C#.NET 4.0的项目。
我想从这个网站只发布所需的文件传送到目标位置(C:\建立\ MyProject的[文件])
我的文件结构:./ProjectRoot/MyProject.csproj ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml
我通过的MSBuild运行以下:
C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ MSBuild.exe ./ProjectRoot/MyProject.csproj / P:DeployOnBuild =真/p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml
下面是FileSystemDebug.pubxml的XML
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<ExcludeApp_Data>False</ExcludeApp_Data>
<publishUrl>C:\builds\MyProject\</publishUrl>
<DeleteExistingFiles>True</DeleteExistingFiles>
</PropertyGroup>
</Project>
产生的行为是:
- 在这里创建一个zip文件:./ProjectRoot/obj/Debug/Package/MyProject.zip
- 没有被部署到
<publishUrl>C:\builds\MyProject\</publishUrl>
WTF - 创建的压缩文件是猪早餐和全时不需要对应用程序文件。
当我通过Visual Studio运行此发布配置文件是在* C创建的文件夹:\建立\ MyProject的*,并包含我想确切的假象。
如何获取MSBuild中的这个简单的结果呢?
FYI:我曾与Visual Studio 2015年同样的问题很多时间试图后,我现在可以做msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile
。
我不得不修改我的.csproj文件,以获得它的工作。 它包含了这样一行:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets"
Condition="false" />
我改变了这一行,如下所示:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />
(我改变了10.0至14.0,不知道这是否是必要的。但我肯定有删除的条件部分)。
在这里找到了答案: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010中具有很大的新的Web应用程序项目发布功能,让您轻松与按钮的点击发布的Web应用程序项目。 在Web.config改造和包装建立由将被导入到你的项目文件中的大量的MSBuild脚本做幕后(发现在C:\ Program Files文件(x86)的\的MSBuild \微软\ VisualStudio的\ V10.0 \网络\微软.Web.Publishing.targets)。 不幸的是,剧本被无限复杂,混乱和无证(其他然后一些经常拼写错误的而且大多无用文件中的注释)。 该文件的一个很大的流程,以及如何连接它的一些文件将是不错,但似乎是极为缺乏(或至少我不能找到它)。
不幸的是,这意味着通过命令行执行出版是更不透明比它需要。 我因缺少这方面的资料感到惊讶,因为这些天许多商店使用持续集成服务器和有的甚至自动部署(其中VS2010发布功能可以帮助很多有),所以我本来以为启用此(容易!)将一直使用该功能的主要公平的要求。
总之,通过Microsoft.Web.Publishing.targets文件挖了几个小时敲打我的头靠在试错墙后,我设法弄清楚似乎Studio如何视觉执行它的魔力点击“发布到文件系统”和“建设部署包”的特点。 我将进入一个位的MSBuild脚本,所以如果你不熟悉的MSBuild我建议你看看这个速成班MSDN页面。
发布到文件系统
Visual Studio 2010的发布到文件系统对话框发布到文件系统,我花了一段时间螺母,因为我预计一些合理利用的MSBuild正在发生。 相反,VS2010做的东西很奇怪:它调用的MSBuild执行排序半部署,准备在项目的OBJ文件夹中的Web应用程序的文件,那么它似乎做这些文件的手动复制(即MSBuild的以外)到目标文件夹中发布。 这真是乱作一团的行为,因为MSBuild的旨在围绕复制文件(及其他构建相关的东西),所以它会做有道理的,如果整个过程只是一个MSBuild的目标是VS2010呼吁,而不是一个目标,然后手动拷贝。
这意味着,通过上的MSBuild命令行这样做是不是与特定的目标调用您的项目文件,并设置一些属性一样简单。 你需要做的已经做了VS2010应该:创建一个自己的目标执行的,然后一半部署副本的结果到目标文件夹。 编辑您的项目文件,右键单击在VS2010的项目,然后单击卸载项目,然后再次右击,然后单击编辑。 向下滚动,直到你看到进口的Web应用程序目标的导入元素(Microsoft.WebApplication.targets;该文件本身导入前面提到的Microsoft.Web.Publishing.targets文件)。 下面这条线,我们将增加我们的新目标,称为PublishToFileSystem:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
这个目标依赖于PipelinePreDeployCopyAllFilesToOneFolder目标,这是VS2010称它做什么它的手动副本之前。 一些Microsoft.Web.Publishing.targets四处表明,调用此目标导致被放置到由酒店_PackageTempDir指定的目录中的项目文件。
我们在我们的目标调用的第一个任务是错误的任务,据此我们已经放置,以确保如果PublishDestination属性尚未设定的任务只发生的条件。 这将抓住你和错误了的情况下,你忘了指定PublishDestination属性构建。 然后调用MAKEDIR任务创建PublishDestination目录,如果它不存在。
然后,我们定义一个名为项是PublishFiles代表所有_PackageTempDir文件夹下找到该文件。 那么,副本任务被称为所有这些文件复制到发布目标文件夹。 所述DestinationFiles复印元件上的属性是一个有点复杂; 它执行转换项目,并转换他们在PublishDestination文件夹中扎根的新路径的路径(看看驰名项元数据,看看那些%()为人刻薄)。
要调用的命令行,我们现在可以简单地执行此命令(显然改变了项目文件名和属性,以适应你)这个目标:
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
还是遇到了麻烦尝试上述所有问题的答案之后(我使用Visual Studio 2013)。 没有被复制到发布文件夹。
美中不足的是,如果我有一个单独的项目,而不是一个解决方案运行的MSBuild,我必须把它指定的Visual Studio版本的附加参数:
/p:VisualStudioVersion=12.0
12.0
是VS2013,与您使用的版本替换。 有一次,我添加了这个参数,它只是工作。
完整的命令行看起来是这样的:
MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0
我发现在这里:
http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment
他们陈述:
如果指定单个项目,而不是一个解决方案,你必须添加指定的Visual Studio版本的参数。
它看起来对我来说,你的发布不被使用的个人资料,并做一些默认的包装。 微软网站发布的目标去做所有那些你在上面做什么,它选择了根据配置的正确目标。
我有我的工作从TeamCity的MSBuild的步骤没有问题,但我没有指定配置文件的显式路径,你就必须通过名字没有.pubxml(如FileSystemDebug)来调用它。 它会被发现,只要在标准文件夹,你是。
例:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug
请注意,这是使用Visual Studio 2012版本的Microsoft网络的发布目标完成,通常位于 “C:\ Program Files文件(x86)的\的MSBuild \微软\ VisualStudio的\ 11.0 \ WEB”。 退房的部署文件夹中所使用的具体部署类型的目标
FYI:同样的问题(安装的MSBuild 15,从2017年VS在.NET 2.1的核心网项目带动詹金斯)构建服务器上运行。
在我的情况下,它是使用“发布”的目标与MSBuild的是忽略了轮廓。
所以,我的MSBuild的命令开始:
msbuild /t:restore;build;publish
这正确triggerred发布过程,但没有组合或“/ P:PublishProfile = FolderProfile”的变化工作过选择我想用(“FolderProfile”)的轮廓。
当我停止使用发布目标:
msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile
我(愚蠢)认为,也就没有什么区别,但只要我使用的DeployOnBuild打开它正确地拿起轮廓。
首先检查开发PC可以发布解决方案(项目)的Visual Studio的版本。 如图为VS 2013
/p:VisualStudioVersion=12.0
添加上面的命令行指定什么样的一个Visual Studio版本应该构建项目。 由于以前的答案,这可能会发生,当我们试图发布只有一个项目不是整体解决方案。