0

我已经阅读了一些关于自动化构建过程的好文章,但是,我感兴趣的不仅仅是构建过程,而是发布。

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

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

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

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

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

谢谢。

4

3 回答 3

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”然后列编辑多余内容来轻松生成。

IE。

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)”的原因。

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

于 2011-12-27T18:19:36.930 回答
0

使用<ItemGroup />带有自定义元数据的元素,结果如下:

   <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>
于 2011-12-18T23:00:50.427 回答
0

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

我创建了以下 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 控制台应用程序,但是有点矫枉过正,我想知道如何使用批处理文件中的一些循环机制来完成此操作。

于 2011-12-27T05:55:24.593 回答