2013-04-26 78 views
66

我有一个使用VS2010创建的c#.Net 4.0项目,现在正在使用VS2012进行访问。使用msbuild执行文件系统发布配置文件

我试图从本网站只发布所需的文件传送到目标位置(C:\建立\ MyProject的[文件])

我的文件结构: ./ProjectRoot/MyProject .csproj的 ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

我正在通过的MSBuild如下:

C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe ./ProjectRoot/MyProject.csproj/p:DeployOnBuild = true /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得到这个简单的结果?

回答

30

仅供参考:我与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,不知道这是否是必要的,但我肯定有删除的条件部分)

+1

为了向后兼容,存在'Condition =“false”的条件导入。 VS2010要求此导入存在,即使由于虚假情况而被跳过。如果你再看一眼,那么你会看到csproj包含另一个'$(VSToolsPath)\ WebApplications \ Microsoft.WebApplication.targets'的导入,它解析为当前版本的Visual Studio的目标文件。 – 2016-03-04 08:54:12

+3

注意'$(MSBuildToolsVersion)'在正确的VS版本帐户中的战略使用:''。这对我VS2015更新1工作。 – 2016-03-17 03:53:46

35

找到答案在这里: 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:网络\ Microsoft.Web.Publishing.targets)。 不幸的是,脚本是非常复杂,凌乱和 没有记录(其他然后一些 - 拼写错误,大多是无用的 评论在文件中)。该文件和一些 有关如何挂钩的文档的大流程图会很好,但似乎是 可悲缺乏(或至少我找不到它)。

不幸的是,这意味着通过命令行 执行发布比它需要的更加不透明。我感到惊讶的是在这方面文档缺乏 ,因为这些天很多商店使用持续集成服务器,有些甚至做自动化部署 (这VS2010发布功能可以帮助很多),所以我想 会想到(这很容易!)将是一个 该功能的主要要求。

总之,通过Microsoft.Web.Publishing.targets挖 文件几个小时,撞我的头靠在试错墙, 后我设法弄清楚Studio的视觉似乎履行 法宝之一单击“发布到文件系统”和“构建部署 包”功能。我将进入一点MSBuild脚本,所以如果你不熟悉MSBuild 我建议你看看这个崩溃 当然MSDN页面。

发布到文件系统

Visual Studio 2010的发布到文件系统对话框发布到文件系统了 了一段时间才能螺母,因为我预计一些合理利用的MSBuild 的要发生。相反,VS2010的确有些奇怪:它在MSBuild上调用 来执行一种半部署,在你的项目的obj文件夹中准备了web 应用程序的文件,然后它似乎做了这些文件的手动 副本(即外部的MSBuild)到您的目标发布 文件夹。这是真正的重击行为,因为MSBuild被设计为复制周围(和其他构建相关的东西)文件,所以它会有意义 如果整个过程只是一个MS2010的目标VS2010叫做 上,而不是一个目标然后一个手动复制。

这意味着在命令行上通过MSBuild执行此操作并不像 那样简单,因为它可以调用具有特定目标的项目文件,也可以通过设置某些属性 。你需要做VS2010应该完成 :自己创建一个执行半部署的目标,然后 将结果复制到目标文件夹。编辑你的项目文件, 右击VS2010中的项目并点击Unload Project,然后 再次右击并点击Edit。向下滚动,直到找到导入网络应用程序目标 (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指定的目录中。

我们在我们的目标中调用的第一个任务是Error任务,我们在其中设置了一个条件,确保只有在 PublishDestination属性尚未设置时才会发生任务。如果您忘记指定 PublishDestination属性,这会捕获您 并错误构建。然后我们调用MakeDir任务来创建 PublishDestination目录,如果它尚不存在。

然后,我们定义一个名为PublishFiles的项目,它表示在_PackageTempDir文件夹下找到的所有 文件。复制任务然后调用 将所有这些文件复制到发布目标文件夹。 复制元素上的DestinationFiles属性有点复杂; 它执行项目的变换并将它们的路径转换为以PublishDestination文件夹为根的新路径 (查看知名的 项目元数据以查看这些%()的含义)。

要调用的命令行这一目标,我们现在可以简单地执行 此命令(显然改变了项目文件名和属性 适合你):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem 
+3

我无法理解新目标的代码片段(它显示01 02 03 ...)。你能编辑吗? – fan711 2013-10-09 16:56:28

+2

我同意fan711。虽然解决方案是在链接上描述的 - 那么复制它是什么? – 2013-12-11 09:51:55

+4

@АнтонКурьян:链接在一段时间后往往会死亡,这就是为什么stackoverflow.com上的问题和答案应该始终是独立的,而不依赖于外部资源。 – Oliver 2014-09-29 20:51:12

11

它看起来对我来说,您的发布配置文件未被使用,并执行一些默认打包。 Microsoft Web Publish目标完成上面所做的全部工作,它会根据配置选择正确的目标。

我从我的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做:\程序文件(x86)\的MSBuild \微软\ VisualStudio的\ 11.0 \ WEB”。查看用于特定部署类型目标的部署文件夹

+0

MS已经做了很多改进,因为这是几年前发布的,感谢更新的编程? – 2016-01-28 16:43:02

13

尝试所有上述答案(我使用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版本的参数ñ。

+0

这对我工作! – 2017-12-13 06:27:51

0

首先检查可以发布解决方案(项目)的开发人员PC的Visual Studio版本。 如图所示是VS 2013

/p:VisualStudioVersion=12.0 

添加上述命令行指定什么样的一个Visual Studio版本应该构建项目。如前所述,当我们试图发布一个项目而不是整个解决方案时,可能会发生这种情况。

+0

对不起,shammakalubo你错误地解释了这个问题。 – 2017-11-01 20:50:45

+0

@shammakalubo答案是对的,但它没有完全说明。这个参数需要被添加到OP所提到的命令中,然后它会变成:'MSBuild C:\ PathToMyProject \ MyProject.csproj/p:DeployOnBuild = true/p:PublishProfile = MyPublishProfile/p:VisualStudioVersion = 12.0' This参数是我失踪并解决了我的问题。你只需要完全提到答案! – 2017-12-13 06:29:49

相关问题