Use SVN Revisão para rotular construir em CCNET

votos
39

Eu estou usando CCNET em um projeto de exemplo com o SVN como meu controle de origem. CCNET está configurado para criar uma compilação em cada check-in. CCNET utiliza MSBuild para construir o código fonte.

Gostaria de usar o número de revisão mais recente para gerar AssemblyInfo.csdurante a compilação. Como posso recuperar a última revisão de subversão e usar o valor em CCNET?

Edit: Eu não estou usando NAnt - única MSBuild.

Publicado 04/08/2008 em 12:37
fonte usuário
Em outras línguas...                            


12 respostas

votos
44

CruiseControl.Net 1.4.4 tem agora uma versão Assembléia Labeller , que gera números versão compatível com propriedades assembly .NET.

No meu projeto eu tê-lo configurado como:

<labeller type="assemblyVersionLabeller" incrementOnFailure="true" major="1" minor="2"/>

(Aviso: assemblyVersionLabellernão vai começar a gerar etiquetas com base svn revisão até que uma real construção comprometer-desencadeada ocorre.)

e depois consumir este de meus projetos MSBuild com MSBuildCommunityTasks.AssemblyInfo :

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="BeforeBuild">
  <AssemblyInfo Condition="'$(CCNetLabel)' != ''" CodeLanguage="CS" OutputFile="Properties\AssemblyInfo.cs" 
  AssemblyTitle="MyTitle" AssemblyCompany="MyCompany" AssemblyProduct="MyProduct"
  AssemblyCopyright="Copyright ©  2009" ComVisible="false" Guid="some-random-guid"
  AssemblyVersion="$(CCNetLabel)" AssemblyFileVersion="$(CCNetLabel)"/>
</Target>

Pelo amor de completitude, é tão fácil para projetos usando NAnt em vez de MSBuild:

<target name="setversion" description="Sets the version number to CruiseControl.Net label.">
    <script language="C#">
        <references>
            <include name="System.dll" />
        </references>
        <imports>
            <import namespace="System.Text.RegularExpressions" />
        </imports>
        <code><![CDATA[
             [TaskName("setversion-task")]
             public class SetVersionTask : Task
             {
              protected override void ExecuteTask()
              {
               StreamReader reader = new StreamReader(Project.Properties["filename"]);
               string contents = reader.ReadToEnd();
               reader.Close();
               string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["CCNetLabel"] + "\")]";
               string newText = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);
               StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
               writer.Write(newText);
               writer.Close();
              }
             }
             ]]>
        </code>
    </script>
    <foreach item="File" property="filename">
        <in>
            <items basedir="..">
                <include name="**\AssemblyInfo.cs"></include>
            </items>
        </in>
        <do>
            <setversion-task />
        </do>
    </foreach>
</target>
Respondeu 10/06/2009 em 13:37
fonte usuário

votos
14

Você tem basicamente duas opções. Ou você escrever um script simples que irá iniciar e analisar a saída de

Informações svn.exe --revision CABEÇA

para obter o número de revisão (em seguida, gerando assemblyinfo.cs é praticamente linear para a frente), ou simplesmente usar encaixe para CCNET. Aqui está:

SVN Revisão Labeller é um plugin para CruiseControl.NET que lhe permite gerar etiquetas CruiseControl para o seu constrói, com base no número de revisão de sua cópia de trabalho do Subversion. Isto pode ser personalizado com um prefixo e / ou grandes números de versão / menores.

http://code.google.com/p/svnrevisionlabeller/

Eu prefiro a primeira opção porque é apenas cerca de 20 linhas de código:

using System;
using System.Diagnostics;

namespace SvnRevisionNumberParserSample
{
    class Program
    {
        static void Main()
        {
            Process p = Process.Start(new ProcessStartInfo()
                {
                    FileName = @"C:\Program Files\SlikSvn\bin\svn.exe", // path to your svn.exe
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    Arguments = "info --revision HEAD",
                    WorkingDirectory = @"C:\MyProject" // path to your svn working copy
                });

            // command "svn.exe info --revision HEAD" will produce a few lines of output
            p.WaitForExit();

            // our line starts with "Revision: "
            while (!p.StandardOutput.EndOfStream)
            {
                string line = p.StandardOutput.ReadLine();
                if (line.StartsWith("Revision: "))
                {
                    string revision = line.Substring("Revision: ".Length);
                    Console.WriteLine(revision); // show revision number on screen                       
                    break;
                }
            }

            Console.Read();
        }
    }
}
Respondeu 04/08/2008 em 12:56
fonte usuário

votos
4

Eu escrevi um arquivo de construção NAnt que lida com a análise de informações SVN e criando propriedades. Eu, então, usar esses valores de propriedade para uma variedade de tarefas de construção, incluindo a definição da etiqueta na construção. I usar este objectivo combinado com o SVN Revisão Labeller mencionado por Lubos Hasko com excelentes resultados.

<target name="svninfo" description="get the svn checkout information">
    <property name="svn.infotempfile" value="${build.directory}\svninfo.txt" />
    <exec program="${svn.executable}" output="${svn.infotempfile}">
        <arg value="info" />
    </exec>
    <loadfile file="${svn.infotempfile}" property="svn.info" />
    <delete file="${svn.infotempfile}" />

    <property name="match" value="" />

    <regex pattern="URL: (?'match'.*)" input="${svn.info}" />
    <property name="svn.info.url" value="${match}"/>

    <regex pattern="Repository Root: (?'match'.*)" input="${svn.info}" />
    <property name="svn.info.repositoryroot" value="${match}"/>

    <regex pattern="Revision: (?'match'\d+)" input="${svn.info}" />
    <property name="svn.info.revision" value="${match}"/>

    <regex pattern="Last Changed Author: (?'match'\w+)" input="${svn.info}" />
    <property name="svn.info.lastchangedauthor" value="${match}"/>

    <echo message="URL: ${svn.info.url}" />
    <echo message="Repository Root: ${svn.info.repositoryroot}" />
    <echo message="Revision: ${svn.info.revision}" />
    <echo message="Last Changed Author: ${svn.info.lastchangedauthor}" />
</target>
Respondeu 04/08/2008 em 14:43
fonte usuário

votos
4

Se preferir fazê-lo na MSBuildlateral sobre a CCNetconfiguração, parece que o MSBuildTarefas de extensão comunitária SvnVersiontarefa pode fazer o truque.

Respondeu 04/08/2008 em 13:03
fonte usuário

votos
4

Eu encontrei este projeto no Google Code. Este é CCNETo plugin para gerar a etiqueta no CCNET.

O DLLé testado com CCNET 1.3mas funciona com CCNET 1.4para mim. Estou usando com sucesso este plugin para rotular minha construção.

Agora, para passá-la para MSBuild...

Respondeu 04/08/2008 em 12:51
fonte usuário

votos
3

Eu não tenho certeza se este trabalho com CCNET ou não, mas eu criei um SVN versão plug-in para o Desenvolver Versão Incremento projeto no CodePlex. Esta ferramenta é muito flexível e pode ser configurado para criar automaticamente um número de versão para você, utilizando a revisão SVN. Ele não requer escrever qualquer código ou de edição de XML, assim yay!

Espero que este é ajuda!

Respondeu 12/04/2010 em 02:04
fonte usuário

votos
3

Personalizando csproj arquivos para autogenerate AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Cada vez que criar um novo projeto C #, Visual Studio coloca lá o arquivo AssemblyInfo.cs para nós. O arquivo define os meta-dados de montagem como sua versão, configuração ou produtor.

Encontrado a técnica acima para assemblyinfo.cs auto-gen usando MSBuild. Vou postar amostra no momento.

Respondeu 04/08/2008 em 14:22
fonte usuário

votos
3

Atualmente, estou "manualmente" a fazê-lo através de uma Task prebuild-exec, usando o meu cmdnetsvnrev ferramenta, mas se alguém sabe uma maneira melhor integrado ccnet de fazê-lo, eu ficaria feliz em ouvir :-)

Respondeu 04/08/2008 em 12:41
fonte usuário

votos
2

Não faço ideia onde eu encontrei este. Mas eu achei isso na internet "em algum lugar".

Isso atualiza todos os arquivos AssemblyInfo antes da compilação ocorre.

Funciona como um encanto. Todos os meus exe e show de dll como 1.2.3.333 (Se "333" foram a revisão SVN no momento.) (Ea versão original no arquivo AssemblyInfo.cs foi listado como "1.2.3.0")


$ (ProjectDir) (Onde meu ficheiro.SLN reside)

$ (SVNToolPath) (aponta para svn.exe)

são meus variáveis ​​personalizadas, suas declarações / definições não estão definidos abaixo.


http://msbuildtasks.tigris.org/ e / ou https://github.com/loresoft/msbuildtasks tem tarefas a (FileUpdate e svnversion).


  <Target Name="SubVersionBeforeBuildVersionTagItUp">

    <ItemGroup>
      <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
    </ItemGroup>

    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
      <Output TaskParameter="Revision" PropertyName="MySubVersionRevision" />
    </SvnVersion>

    <FileUpdate Files="@(AssemblyInfoFiles)"
            Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="$1.$2.$3.$(MySubVersionRevision)" />
  </Target>

EDIT ------------------------------------------------- -

O anterior pode começar a falhar depois de o seu número de revisão do SVN atinge 65534 ou superior.

Vejo:

Desligue CS1607 aviso

Aqui está a solução alternativa.

<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(SubVersionRevision)" />

O resultado deste deve ser:

Em Windows File / Explorador // / Propriedades .......

Assembleia versão será 1.0.0.0.

Versão do Arquivo será 1.0.0.333 se 333 é a revisão SVN.

Respondeu 18/09/2012 em 18:18
fonte usuário

votos
2

Com base na solução skolimas eu atualizei o script NAnt também para atualizar o AssemblyFileVersion. Graças a skolima para o código!

<target name="setversion" description="Sets the version number to current label.">
        <script language="C#">
            <references>
                    <include name="System.dll" />
            </references>
            <imports>
                    <import namespace="System.Text.RegularExpressions" />
            </imports>
            <code><![CDATA[
                     [TaskName("setversion-task")]
                     public class SetVersionTask : Task
                     {
                      protected override void ExecuteTask()
                      {
                       StreamReader reader = new StreamReader(Project.Properties["filename"]);
                       string contents = reader.ReadToEnd();
                       reader.Close();                     
                       // replace assembly version
                       string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);                                        
                       // replace assembly file version
                       replacement = "[assembly: AssemblyFileVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyFileVersion\("".*""\)\]", replacement);                                        
                       StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
                       writer.Write(contents);
                       writer.Close();
                      }
                     }
                     ]]>
            </code>
        </script>
        <foreach item="File" property="filename">
            <in>
                    <items basedir="${srcDir}">
                            <include name="**\AssemblyInfo.cs"></include>
                    </items>
            </in>
            <do>
                    <setversion-task />
            </do>
        </foreach>
    </target>
Respondeu 12/09/2009 em 11:03
fonte usuário

votos
2

Minha abordagem é usar o plugin acima referidas, para ccnet e uma tarefa nant echo para gerar um VersionInfo.csarquivo contendo nada, mas atribui a versão. Eu só tenho que incluir o VersionInfo.csarquivo para a construção

A tarefa de eco simplesmente exibe a string Dou-lhe para um arquivo.

Se houver uma tarefa semelhante MSBuild, você pode usar a mesma abordagem. Aqui está a pequena tarefa nant eu uso:

<target name="version" description="outputs version number to VersionInfo.cs">
  <echo file="${projectdir}/Properties/VersionInfo.cs">
    [assembly: System.Reflection.AssemblyVersion("$(CCNetLabel)")]
    [assembly: System.Reflection.AssemblyFileVersion("$(CCNetLabel)")]
  </echo>
</target>

Tente isto:

<ItemGroup>
    <VersionInfoFile Include="VersionInfo.cs"/>
    <VersionAttributes>
        [assembly: System.Reflection.AssemblyVersion("${CCNetLabel}")]
        [assembly: System.Reflection.AssemblyFileVersion("${CCNetLabel}")]
    </VersionAttributes>
</ItemGroup>
<Target Name="WriteToFile">
    <WriteLinesToFile
        File="@(VersionInfoFile)"
        Lines="@(VersionAttributes)"
        Overwrite="true"/>
</Target>

Por favor note que eu não sou muito íntimo com MSBuild, por isso o meu script provavelmente não vai funcionar out-of-the-box e precisa de correções ...

Respondeu 03/02/2009 em 05:16
fonte usuário

votos
1

Seja cuidadoso. A estrutura utilizada para números de compilação é apenas uma curta para que você tenha um teto de quão alto o seu revisão pode ir.

No nosso caso, nós já excedeu o limite.

Se você tentar colocar no número de compilação 99.99.99.599999, a propriedade versão do arquivo vai realmente sair como 99.99.99.10175.

Respondeu 03/02/2009 em 19:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more