Pregunta

leí el artículo de John Robbins TFS 2010 el número de compilación y de la Asamblea de versiones de archivo: completamente en sincronía con Sólo MSBUILD 4.0 , y me pregunto cuál es la mejor manera de ir sobre la integración de esta.

La descarga para el artículo tiene dos archivos, uno es un archivo objetivos y uno es un archivo proj.

El archivo objetivos tiene una serie de tareas para raspar un número de compilación basado en el número de compilación TFS (el mismo utilizado para las compilaciones) y escribir ese número en cierta ubicación (llamarlo BuildNumberFile) para el consumo de otras proj archivos.

El archivo proj es muy simple. Sólo importa el archivo objetivos contemplados y, a continuación, declara un objetivo con el nombre "All", mientras que también se declara DefaultTargets en el elemento de proyecto a ser todo así.

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

Tengo dos preguntas acerca de esto:

  • todavía estoy aprendiendo MSBuild. Si el nombre del destino no se especifica otra parte de los objetivos, se ejecuta el objetivo? ¿Cómo puedo garantizar que este objetivo está dirigido?
  • ¿Son los archivos csproj supuestos para declarar una inclusión del tema de la ubicación en la BuildNumberFile es, a pesar de que no existe hasta tiempo de compilación?
  • Incluir ItemGroups y tener un DependsOnTargets o algo que les permite asegurarse de que el archivo existe antes de construir?
  • ¿Son todo el contenido del archivo csproj utilizando esta supuesta a ser envuelto en un objetivo que expresa DependsOnTargets para BuildNumberFile?

Gracias!

¿Fue útil?

Solución

Creo Tengo esta resuelto, pero dos personas promoví mi pregunta de manera voy a responder aquí:

  • Se puede asegurar que un blanco se ejecuta mediante la expresión de una dependencia en él desde otro objetivo. Microsoft.Common.targets expone dos objetivos - BeforeBuild y AfterBuild - expresamente con el propósito de ser anulado para personalización. He encontrado la manera más fácil de hacer esto era <Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" /> donde WriteSharedCSharpAssemblyVersionFile es el objetivo declarado en la descarga desde el enlace en el post original. Además, si usted es nuevo en MSBuild, este objetivo BeforeBuild debe ser declarado después de los Microsoft.CSharp.targets es importado, pero los csproj predeterminado plantilla le guía al hacer esto.

  • El objetivo WriteSharedCSharpAssemblyVersionFile de hecho debe escribir el archivo en un sitio central, ya que en la construcción de una solución, todos los objetivos se ejecuta sólo una vez. Todos los proyectos deben referencia al archivo de ese lugar, incluso si no existe, ya que por el tiempo de compilación que sucede (o, más importante, en el momento en que se resuelvan las referencias), el objetivo BeforeBuild se han ejecutado y el archivo estará en su lugar.

    • En la estructura de mi, tengo estas versiones de los archivos en una carpeta directamente debajo de la carpeta raíz rama. Además, puesto que se genera el archivo que se está construyendo, tengo que construir para el directorio de salida. Parece un poco extraño estar en incluir cosas desde la salida, pero conserva el invariante de tener todos los productos de construcción en un solo lugar para que el directorio de salida puede perder la cabeza como un medio de realizar una limpieza.
  • Los productos en MSBuild constituyen elementos de entrada en el sistema (normalmente archivos) por lo que es raro pensar en ellos en función de los objetivos. Después de un cierto aprendizaje esta pregunta no tiene mucho sentido. En cualquier caso, la respuesta es no.

  • Todo el contenido del archivo debe de hecho, no todos en un objetivo - todo lo que se requiere es importar el archivo Wintellect.TFSBuildNumber.targets al comienzo de su archivo csproj, y declarar la dependencia de BeforeBuild en WriteSharedCSharpAssemblyVersionFile al final.

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top