【问题标题】:Automating publish Visual Studio 2010 functionalities?自动化发布 Visual Studio 2010 功能?
【发布时间】:2012-01-21 09:11:18
【问题描述】:

我读过一些关于自动化构建过程的good posts,但是,我感兴趣的不仅仅是构建过程,而是发布。

我有几个使用基本模型的网站和服务。当我更改该模型时(这不会经常发生),所有站点/服务都必须重新构建并发布到其适当的目标目录(已包含在其配置中)。

所有项目文件夹都存在于一个文件夹中。

我正在考虑的方法是使用 MSBuild 从主文件夹运行脚本,并带有要构建/发布的项目的命名列表。

我找到了一个为 MSBuild here 创建构建脚本的好例子,但是,这只满足一个项目的构建。

如何让流程通过项目/目录的命名列表来执行相同的构建/发布脚本?

谢谢。

【问题讨论】:

  • 您是否考虑过创建解决方案? MSBuild 也知道如何构建它们。
  • 这让我走上了不同的轨道……我会检查一下,谢谢。

标签: visual-studio-2010 build-process build-automation publishing-site


【解决方案1】:

最终的、可重用的解决方案如下。

回顾:

我在一个根文件夹中有几个站点,它们的目录和项目文件名都命名为该站点的值。我希望能够从命令行发布所有站点(或选定列表) - 运行脚本。然后将网站发布到我的 IIS 服务器目录。

首先,创建一个接受网站名称参数的MSBuild脚本:

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Compile,Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name ="DeleteFiles">
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\debug\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\release\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).pdb"></Delete>
  </Target>

  <Target Name="Compile" DependsOnTargets="DeleteFiles">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
      Targets="Clean;Build"
      Properties="OutputPath=..\$(ProjectName)\bin"/>
  </Target>

  <Target Name="Deploy" DependsOnTargets="Compile">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
        Targets="ResolveReferences;_CopyWebApplication"
        Properties="OutDir=C:\inetpub\wwwroot\$(ProjectName)\bin\;WebProjectOutputDir=C:\inetpub\wwwroot\$(ProjectName)" />
  </Target>

</Project>

接下来,创建一个文本文件,每行一个网站名称。这可以通过执行“dir > sites.txt”然后列编辑多余内容来轻松生成。

即。

site1.com
site2.com
site3.com
site4.com

最后,创建一个批处理文件,遍历sites.txt 中包含的列表,并执行MSBuild 脚本:

@echo --------------------------------------------
@echo --  Iterating through list in sites.txt  --
@echo --------------------------------------------
for /f %%X in (sites.txt) do msbuild build.xml /p:ProjectName="%%X" /v:n

此解决方案与根目录中的其他网站位于同一级别的目录中,这就是构建脚本中“..\$(ProjectName)”的原因。

发布大量网站的好方法,希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    使用带有自定义元数据的 &lt;ItemGroup /&gt; 元素,结果如下:

       <ItemGroup>
          <ProjectToPublish Include="WebApplication1\WebApplication1.csproj" >
                    <OutputDir>OutputDir1</OutputDir>
          </ProjectToPublish>
          <ProjectToPublish Include="WebApplication2\WebApplication2.csproj" >
                    <OutputDir>OutputDir2</OutputDir>
          </ProjectToPublish>
       </ItemGroup>
    
       <Target Name="Publish" Inputs="@(ProjectsToPublish)" Outputs="%(Identity).Dummy">
          <RemoveDir Directories="%(OutputDir)" ContinueOnError="true" />
          <MSBuild Projects="%(Identity)"
             Targets="ResolveReferences;_CopyWebApplication"
             Properties="WebProjectOutputDir=$(OutputDir);
             OutDir=%(OutputDir)\" />
       </Target>
    

    【讨论】:

      【解决方案3】:

      所以我终于有时间再看看这个。

      我创建了以下 MSBuild 脚本,该脚本位于我拥有的所有网站的同一级别的文件夹中。

      <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      
      
        <Target Name ="DeleteFiles">
          <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\debug\$(ProjectName).dll"></Delete>
          <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\release\$(ProjectName).dll"></Delete>
          <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).dll"></Delete>
          <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).pdb"></Delete>
        </Target>
      
        <Target Name="Compile" DependsOnTargets="DeleteFiles">
          <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
            Targets="Clean;Build"
            Properties="OutputPath=..\$(ProjectName)\bin"/>
        </Target>
      
        <Target Name="Deploy" DependsOnTargets="Compile">
          <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
              Targets="ResolveReferences;_CopyWebApplication"
              Properties="OutDir=C:\inetpub\wwwroot\$(ProjectName)\bin\;WebProjectOutputDir=C:\inetpub\wwwroot\$(ProjectName)" />
        </Target>
      
      
      </Project>
      

      并且是这样调用的:

      msbuild build.xml /p:ProjectName="websitetopublish.com" /v:n

      适用于一个站点,但我想要一个读取文本文件的与批处理相关的解决方案。对于该文本文件中的每个条目,执行构建过程。

      我很容易为此编写一个 .Net 控制台应用程序,但是有点过头了,我想知道如何在批处理文件中使用一些 for 循环机制来完成此操作。

      【讨论】:

      • 嗨...我尝试这样做,但收到一些错误,如“错误 MSB4057:项目中不存在目标“编译、部署””...我尝试搜索但找不到很多..你是否面临同样的情况
      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多