Cómo modificar el csdef definido en un cspkg

Para implementar en diferentes entornos Azure, modifico csdef como parte del paso de compilación para cambiar los encabezados de host. Hacerlo requiere compilar el cspkg una vez para cada entorno en lugar de poder reutilizar el cspkg y especificar diferentes configuraciones para la implementación.

En su lugar, me gustaría modificar el archivo csdef de un cspkg después de que se haya creado, sin volver a compilar. ¿Es eso posible, y si es así, cómo?

preguntado el 03 de mayo de 12 a las 15:05

3 Respuestas

He hecho algo similar a lo que buscas para diferenciar entre entornos de prueba y en vivo. En primer lugar, debe crear un nuevo archivo .csdef que desee utilizar para su configuración alternativa. Este debe ser el archivo completo, ya que solo vamos a intercambiarlo con el original. Ahora necesitamos agregar esto al proyecto en la nube. Haga clic con el botón derecho en el proyecto en la nube y seleccione descargar proyecto. Haga clic derecho sobre él nuevamente y seleccione Editar [Nombre del proyecto]. Hay una sección que se parece un poco a esto:

<ItemGroup>
    <ServiceConfiguration Include="ServiceConfiguration.Test.cscfg" />
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
</ItemGroup>

Agregue un nuevo elemento ServiceDefinition que apunte a su archivo recién creado. Ahora encuentra la siguiente línea:

<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />

Luego agregue este bloque de código, edite la verificación TargeProfile para que sea la configuración de compilación que desea usar para su alternativa y asegúrese de que apunte a su nuevo archivo .csdef

<Target Name="AfterResolveServiceModel">
    <!-- This should be run after it has figured out which definition file to use
        but before it's done anything with it.  This is all a bit hard coded, but
        basically it should remove everything from the SourceServiceDefinition
        item and replace it with the one we want if this is a build for test-->
    <ItemGroup>
      <!-- This is an interesting way of saying remove everything that is in me from me-->
      <SourceServiceDefinition Remove="@(SourceServiceDefinition)" />
      <TargetServiceDefinition Remove="@(TargetServiceDefinition)" />
    </ItemGroup>
    <ItemGroup Condition="'$(TargetProfile)' == 'Test'">
      <SourceServiceDefinition Include="ServiceDefinition.Test.csdef" />
    </ItemGroup>
    <ItemGroup Condition="'$(TargetProfile)' != 'Test'">
      <SourceServiceDefinition Include="ServiceDefinition.csdef" />
    </ItemGroup>
    <ItemGroup>
      <TargetServiceDefinition Include="@(SourceServiceDefinition->'%(RecursiveDirectory)%(Filename).build%(Extension)')" />
    </ItemGroup>
    <Message Text="Source Service Definition Changed To Be: @(SourceServiceDefinition)" />
  </Target>

Para volver a la normalidad, haga clic derecho en el proyecto y seleccione Recargar proyecto. Ahora, cuando construya su proyecto, según la configuración que use, usará diferentes archivos .csdef. Vale la pena señalar que el editor de configuración no conoce su segundo archivo .csdef, por lo que si agrega alguna configuración nueva a través de la GUI, deberá agregarla manualmente a esta versión alternativa.

contestado el 03 de mayo de 12 a las 23:05

Esto funcionaría, pero requiere volver a compilar. Espero poder intercambiar los archivos csdef sin volver a compilar. - Evan

Si solo desea tener un CSDEF diferente, puede hacerlo fácilmente usando el símbolo del sistema CSPACK directamente como se muestra a continuación:

  1. Abra las ventanas de comandos y localice la carpeta donde tiene su carpeta CSDEF/CSCFG y CSX relacionada con su proyecto de Windows Azure
  2. Cree múltiples CSDEF dependiendo de sus cambios menores
  3. Asegúrese de tener el SDK de Windows Azure en la ruta para iniciar los comandos CS*
  4. USE el comando CSPACK y pase los parámetros para usar diferentes archivos CSDEF y CSPKG de salida, algo similar a lo siguiente:

cspack <ProjectName>\ServiceDefinitionOne.csdef /out:ProjectNameSame.csx /out:ProjectOne.cspkg /_AddMoreParams

cspack <ProjectName>\ServiceDefinitionTwo.csdef /out:ProjectNameSame.csx /out:ProjectTwo.cspkg /_AddMoreParams

Más sobre CSPACK: http://msdn.microsoft.com/en-us/library/windowsazure/gg432988.aspx

Respondido 07 Oct 15, 22:10

Esto parece que está en el camino correcto, pero creo que me estoy perdiendo algo. Después de mi compilación, solo tengo cspkg y cscfg, no estoy seguro de cómo obtener una carpeta csx. Además, he leído que hay encriptación en los archivos cspkg, ¿esto romperá la encriptación? - Evan

CSPKG no está cifrado después de Azure SDK 1.5, así que no se preocupe por eso. Si ejecuta el comando CSPACK adecuado, generará CSPKG, así que siga trabajando; de lo contrario, proporcione su comando y verificaré qué está mal. - AvkashChauhan

Corro msbuild /nologo solution.sln /p:SkipInvalidConfigurations=true /p:PublishDir=C:\publishDir /p:TargetProfile=dev /t:publish /p:OutDir=C:\outputDir /p:Configuration="Release" /p:Platform="Any CPU" /p:RunCodeAnalysis="False" /v:minimal y me quedo con un archivo cspkg en mi directorio de publicación. No estoy seguro de cómo obtener la carpeta csx. - Evan

Hasta donde yo sé, no puede modificar fácilmente el .cspkg después de crearlo. Supongo que probablemente técnicamente podría ya que el .cspkg es un archivo zip que sigue una determinada estructura.

La pregunta que yo haría es ¿por qué? Si se trata de modificar configuraciones como el tamaño del rol de VM (ya que está definido en el archivo .csdef), entonces creo que tiene un par de enfoques alternativos:

  • Cree un proyecto de implementación de Windows Azure independiente (.csproj) para cada variación. Sí, me doy cuenta de que esto puede ser una molestia, pero permite que las herramientas de Visual Studio funcionen bien. El pequeño dolor puede valer la pena tener el soporte de herramientas más fácil de usar.
  • Ejecute una transformación del archivo de configuración como parte del proceso de compilación. Similar a una transformación web.config.

Personalmente, voy con el enfoque diferente de .csproj. Principalmente porque no soy un ninja de transformación de archivos de configuración. . . aún. ;) Este fue el camino de menor resistencia y funcionó bastante bien hasta ahora.

contestado el 03 de mayo de 12 a las 15:05

¿Quiere decir agregar un nuevo ccproj para cada uno? - Evan

Sí, creando un nuevo proyecto de implementación de Windows Azure (.ccproj) para cada destino de implementación. - Mcollier

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.