首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用msbuild执行文件系统发布配置文件

使用msbuild执行文件系统发布配置文件
EN

Stack Overflow用户
提问于 2013-04-27 07:19:20
回答 8查看 108.5K关注 0票数 96

我有一个用VS2010创建的c# .Net 4.0项目,现在可以用VS2012访问它。

我正在尝试仅将此网站中所需的文件发布到目标位置(C:\builds\MyProjectFiles)

我的文件结构:ProjectRoot.//MyProject.csproj

我正在通过MSBuild运行以下内容:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe。/项目根/MyProject.csproj /p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml /p:DeployOnBuild=true

这是FileSystemDebug.pubxml中的

代码语言:javascript
复制
<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>

产生的行为是:

  • 创建了一个压缩文件,并将其部署到application.

  • 。创建的压缩文件是一份猪早餐,其中包含了WTF不需要的文件。

当我通过visual studio运行此发布配置文件时,将在*C:\builds\MyProject*处创建一个文件夹,其中包含我所需的确切工件。

如何从msbuild获得这个简单的结果?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-01-22 17:45:02

仅供参考:我在Visual Studio 2015上也遇到了同样的问题。经过几个小时的尝试,我现在可以做msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile了。

我不得不编辑我的.csproj文件来让它工作。它包含这样一行:

代码语言:javascript
复制
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

我更改了这一行,如下所示:

代码语言:javascript
复制
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />

(我将10.0更改为14.0,不确定是否有此必要。但我肯定必须删除条件部分。)

票数 57
EN

Stack Overflow用户

发布于 2013-04-27 07:43:15

在这里找到了答案:http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio2010有很棒的新Web应用程序项目发布功能,让您只需单击一个按钮即可轻松发布web应用程序项目。在后台,Web.config转换和包构建是由导入到项目文件(位于C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets). )中的大型MSBuild脚本完成的不幸的是,这个脚本非常复杂,杂乱无章,而且没有文档记录(除了文件中一些经常拼写错误且大多是无用的注释)。该文件的一个大流程图和一些关于如何连接到它的文档将会很好,但遗憾的是似乎缺少(或者至少我找不到它)。

不幸的是,这意味着通过命令行执行发布比需要的更不透明。我对这方面的文档的缺乏感到惊讶,因为现在许多公司都使用持续集成服务器,有些甚至进行自动化部署( VS2010发布特性对此有很大帮助),所以我会认为启用它(很容易!)将是该功能的一个相当主要的需求。

无论如何,在研究了Microsoft.Web.Publishing.targets文件几个小时后,我终于弄清楚了Visual Studio似乎是如何通过单击“发布到文件系统”和“构建部署包”功能来实现它的魔力的。我将介绍一些MSBuild脚本编程,所以如果你不熟悉MSBuild,我建议你去看看这个速成课程MSDN页面。

发布到文件系统

VS2010发布到文件系统对话框发布到文件系统花了我一段时间才弄明白,因为我预计会发生一些对MSBuild的合理使用。相反,VS2010做了一些非常奇怪的事情:它调用MSBuild来执行一种半部署,在你的项目的obj文件夹中准备web应用程序的文件,然后它似乎会手动复制这些文件(即.MSBuild外部)复制到您的目标发布文件夹。这是非常奇怪的行为,因为MSBuild被设计为复制文件(以及其他与构建相关的东西),所以如果整个过程只是VS2010调用的一个MSBuild目标,而不是一个目标然后手动复制,这将是有意义的。

这意味着,通过命令行上的MSBuild完成此操作并不像使用特定目标调用项目文件并设置某些属性那么简单。您需要做VS2010应该做的事情:自己创建一个执行半部署的目标,然后将结果复制到目标文件夹。要编辑项目文件,请在VS2010中右键单击项目,然后单击卸载项目,然后再次右键单击并单击编辑。向下滚动,直到找到导入web应用程序目标的Import元素(Microsoft.WebApplication.targets;此文件本身导入前面提到的Microsoft.Web.Publishing.targets文件)。在这一行下面,我们将添加名为PublishToFileSystem的新目标:

代码语言:javascript
复制
<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属性的情况下生成错误。然后,如果该PublishDestination目录不存在,我们调用MakeDir任务来创建该目录。

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

要从命令行调用此目标,我们现在只需执行此命令(显然,更改项目文件名和属性以适合您):

代码语言:javascript
复制
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
票数 43
EN

Stack Overflow用户

发布于 2016-05-10 17:32:49

在尝试了上面的所有答案后仍然有问题(我使用Visual Studio 2013)。未将任何内容复制到发布文件夹。

问题是,如果我使用单个项目而不是解决方案运行MSBuild,我必须添加一个额外的参数来指定Visual Studio版本:

代码语言:javascript
复制
/p:VisualStudioVersion=12.0

12.0适用于VS2013,请替换为您使用的版本。一旦我添加了这个参数,它就可以工作了。

完整的命令行如下所示:

代码语言:javascript
复制
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版本的参数。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16246562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档