Pregunta

Estoy reescribiendo nuestra de NAnt scripts de creación para hacerlos más limpio y sencillo, así como más general propósito.

Uno de los pasos en nuestro proceso de construcción es empaquetar ciertos archivos en un archivo zip. Antes de que habíamos creado una fileset con una gran cantidad de tipos de archivos incluidos , tratando de recuperar todo lo que podría ser en el proyecto. Esto causó problemas de vez en cuando, cuando quisimos incluir un tipo de archivo no estándar con el proyecto.

Yo esperaba que pudiera encontrar una manera de crear una fileset basado en los archivos (y, también, un subconjunto de los archivos) que aparece en el archivo de proyecto de Visual Studio (.csproj). entonces podría utilizar este conjunto de archivos en un href="http://nant.sourceforge.net/release/latest/help/tasks/zip.html" rel="nofollow noreferrer"> zip tarea . No he encontrado nada de lo que lo hace automáticamente (aunque el ahora obsoleto- tarea SLiNgshoT en NAntContrib parecía un poco prometedora).

Empecé por el camino de tratar de hacerlo de forma manual, pero he quedado atascado. Tengo un objetivo que recibe el proyecto de la solución (utilizando regex ), entonces intenta que cada archivo contenido en el proyecto utilizando xmlpeek (con la /n:Project/n:ItemGroup/n:Content/@Include consulta XPath). El problema aquí es que xmlpeek no devuelve todos los valores , sólo el primero. Y, aunque lo hiciera volver cada valor, no estoy seguro de cómo me ponía en un fileset desde aquí.

¿Hay alguna manera de salvar esta pista de pensar? Puedo lograr lo que quiero con una tarea de NAnt personalizado (preferiría no tener cada proyecto depende de una tarea personalizada)? ¿Hay alguna manera integrada para hacer esto que no estoy encontrando?

No dude en hacer preguntas en los comentarios si algo de mi meta o método no es clara.

Gracias!


ACTUALIZACIÓN: Para aclarar, mi punto de todo esto es hacer que todo el proceso mucho más fluida. Mientras que puedo agregar fácilmente todos los archivos .xml de un paquete, esto a menudo se .xml archivos que viven en la misma carpeta, pero en realidad no son parte del proyecto. Cuando ya tengo una lista de los archivos que los usos del proyecto (separados entre contenido y de otros tipos, incluso), parece una pena no poder utilizar esa información. En última instancia, nadie debería tener que tocar el fichero de construcción para cambiar lo que se incluye en un paquete. No parece como demasiado de una tubería de sueño para mí ...

¿Fue útil?

Solución

esta pregunta relacionada . La interfaz Microsoft.Build.BuildEngine le debe permitir obtener un mejor acceso a la información que necesita, pero por desgracia creo que tendría que construir una tarea personalizada.

Pero pienso que analizar un archivo de proyecto para generar un conjunto de archivos que se utiliza en otros lugares es ... un poco mucho para poner todo dentro de su escritura de la estructura. Y ya que parece que desee volver a utilizar esto, no creo que en función de una tarea personalizada es peor que cualquier otra forma de reutilización (incluso si usted puede hacerlo todo en tareas Nant existentes, que había todavía tiene que tener cada proyecto heredan ese proceso de alguna manera).

Otros consejos

En cuanto a la lectura de los archivos del proyecto. Yo he hecho algo como esto antes. Acabé de escribir un programa que lea los archivos de proyecto y construyó un proyecto personalizado por fichero de construcción del proyecto.

Sin embargo, yo estaba tratando de compilar mi código base. Parece que está intentando simplemente la cremallera.

Teniendo en cuenta que la tarea postal le permitirá ejecutar varios conjuntos de archivos en ella se podría crear algunos conjuntos de archivos genéricos y luego simplemente actualizar para sus seres específicos con bastante facilidad.

Por lo que podría tener algo como esto:

<fileset id="project.source.objects">
  <include name="**/*.cs"/>
  <include name="**/*.xml"/>
  <include name="**/*.resx"/>
</fileset>

<fileset id="project.misc.sources">
  <include name="MyFile1.someext"/>
</fileset>

A continuación, en su objetivo de cremallera sólo hay que poner:

<zip zipfile="myzip.zip">
  <fileset refid="project.source.objects"/>
  <fileset refid="project.misc.sources"/>
</zip>

Ahora si quería específicos del proyecto. Hay otra cosa que podría hacer. Si está utilizando VS2005 o mayor búsqueda en T4. Es un marco de plantilla para la creación de plugins que permiten que tiene archivos adicionales generados cuando se hace algo. Algo así como cuando se haga un diagrama de clases o tener un XSD (y que llega a su código detrás de archivo, se hace de esta manera).

En la mayoría de los proyectos que he trabajado mantenemos un fichero de construcción para cada proyecto y si prefieres algo más al día. Ya que tenemos los conjuntos de archivos genéricos que es un comienzo, así que sólo necesitamos para actualizar el archivo de la materia oscura.

Espero que ayude. Si se pudiera proporcionar un poco más de detalle que podría ser capaz de ayudar aún más.

Me gusta la primera parte de la idea de Josh.

Escribir una pequeña aplicación de consola para tirar de los archivos de la .csproj (ya que es sólo XML en allí) y escribir la lista en un archivo.

En lugar de tarea postal de Nant, me gustaría utilizar 7-zip para crear el archivo con el lista que ha generado en el paso anterior:

(Estoy creando un archivo de extracción automática aquí)

<target name="ZipBuild">
  <exec program="${SevenZip}" workingdir="${SolutionPath}/Installation/Build.Staging">
    <arg value="a" />
    <arg value="-sfx" />
    <arg value="ReferenceBuild-${build.number}.exe" />
    <arg value="@mycustomfilelist.txt" />
  </exec>
</target>

Espero que ayude,

-Jason

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