visual-studio-2010 - visual - vscode beautiful
TFS Build no transforma web.config como se esperaba (5)
El objetivo es que TFS cree e implemente 2 o más configuraciones diferentes, y haga que los archivos de transformación web.config incluyan el contenido deseado en su salida. Esto en un proyecto ASP.NET MVC.
Web.Debug.Config - ver en PasteBin .
Web.Release.Config - ver en PasteBin
Los 2 archivos de configuración transformados tienen su Acción de compilación establecida en Ninguno . Esto se modificó porque los 3 archivos de configuración web. *. Se estaban incluyendo en la implementación.
TFS está configurado correctamente para compilar e implementar ambas configuraciones. Se implementa en las 2 ubicaciones de entrega como se esperaba. No hay argumentos de MSBuild especificados en la definición de compilación.
Problema : los 2 sitios web creados y desplegados tienen el mismo archivo web.config. Básicamente es como si los archivos transformados no existieran.
Se esperaba : los cambios especificados ( xdt:Transform="Replace"
y xdt:Transform="Remove"
) estarían presentes en los archivos web.config.
¿Cómo puede configurar su proyecto o TFS para garantizar que las transformaciones web.config se procesen y sus salidas se implementen en las ubicaciones de implementación correctas? ¿Qué más puedo verificar / modificar?
- Han confirmado que las transformaciones son buenas: el tutorial de Vishal, Joshit, con MSBuild en la línea de comandos ¡dio como resultado las transformaciones correctas!
- No se han realizado modificaciones al .csproj para ninguna implementación posterior o implementación.
- ¿
xdt
atributosxdt
está siendo mal utilizado o falta? - No hay argumentos de MSBuild especificados en la definición de compilación.
- ¿Las acciones de compilación web.config están configuradas correctamente?
- No estamos usando paquetes de despliegue web ni nada. Simplemente esperando copiar estas salidas en sus diferentes ubicaciones de servidores web en una fecha posterior.
Si me falta información importante, deje un comentario e incluiré más información relevante.
Esto es lo que he estado usando. La tarea actual TransformXml tiene un error donde deja archivos abiertos. Lea más here .
Puede invocar esta tarea e implementarla para cada configuración con la que esté trabajando.
<Target Name="TransformWebConfig">
<PropertyGroup>
<_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile>
<_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile>
</PropertyGroup>
<Copy SourceFiles="$(_websiteDirectory)/Web.config" DestinationFiles="$(_tempSourceFile)"/>
<Copy SourceFiles="$(_websiteDirectory)/Web.$(_transformConfiguration).config" DestinationFiles="$(_tempTransformFile)"/>
<MSBuild.Community.Tasks.Attrib Files="$(_websiteDirectory)/Web.config" ReadOnly="false" />
<TransformXml Source="$(_tempSourceFile)"
Transform="$(_tempTransformFile)"
Destination="$(_websiteDirectory)/Web.config"
StackTrace="false" />
</Target>
Intente no configurar Build Platform: elimine básicamente "Any CPU" en ItemToBuild y seleccione la plataforma MSBuild como "Auto"
La gota en realidad no hace ninguna transformación. Lo que necesita es agregar /p:DeployOnBuild=True
a los argumentos de MSBuild.
Esto creará un paquete que luego se puede usar para instalar el sitio web a través de la línea de comando o mediante el asistente de la aplicación de importación IIS.
Si lo que buscas es publicar directamente más de una configuración que es una historia completamente diferente y así es como me tropecé con esta publicación.
Previamente había estado haciendo algo similar a las otras respuestas. Sin embargo, acabo de encontrar lo que parece ser una mejor solución a este problema. Simplemente agregue "/ p: UseWPP_CopyWebApplication = true / p: PipelineDependsOnBuild = false" a sus argumentos de MSBuild. Acabo de probar esto en una de mis versiones TFS y funciona muy bien.
Encontré este gran consejo aquí: http://www.andygeldman.com/index.php/2011/10/web-and-app-config-transformations-with-tfs-build .
TFS Team Build 2010 no transforma automáticamente sus Web.configs. Debe agregar una actividad de flujo de trabajo personalizada a su plantilla de proceso de compilación para lograr esto.
Edwald Hofman tiene un buen blog que explica cómo modificar TFS 2010 Build Process Templates, así que no profundizaré en eso aquí.
Después de averiguar cómo agregar actividades personalizadas a su plantilla de proceso de compilación, agregue la siguiente actividad en su flujo de trabajo, agregué la actividad después de "Soltar los archivos para soltar la ubicación". Utiliza el ensamblado Microsoft.Web.Publishing.Tasks (ubicado: C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v10.0/Web
) para realizar las transformaciones:
/// <summary>
/// Transforms configuration files using TransformXml
/// </summary>
[BuildActivity(HostEnvironmentOption.All)]
public sealed class WebConfigTransform : CodeActivity
{
#region Public Properties
/// <summary>
/// The binaries folder
/// </summary>
[RequiredArgument]
public InArgument<string> BinariesLocation { get; set; }
#endregion
#region Overrides of CodeActivity
/// <summary>
/// When implemented in a derived class, performs the execution of the activity.
/// </summary>
/// <param name="context">The execution context under which the activity executes.</param>
protected override void Execute(CodeActivityContext context)
{
var binariesFolder = context.GetValue(BinariesLocation);
foreach (var sourceFolder in Directory.GetDirectories(Path.Combine(binariesFolder, "_PublishedWebsites")))
{
var sourceFile = Path.Combine(sourceFolder, "Web.config");
if (File.Exists(sourceFile))
{
var filesToTransform = Directory.GetFiles(sourceFolder, "Web.*.config");
foreach (var fileToTransform in filesToTransform)
{
var tempSourceFile = Path.GetTempFileName();
var tempTransformFile = Path.GetTempFileName();
File.Copy(sourceFile, tempSourceFile, true);
File.Copy(fileToTransform, tempTransformFile, true);
var transformation = new TransformXml
{
BuildEngine = new BuildEngineStub(),
Source = tempSourceFile,
Transform = tempTransformFile,
Destination = fileToTransform
};
transformation.Execute();
}
}
}
}
#endregion
}
Deberá pasarle la ubicación de colocación en el flujo de trabajo. Cuando lo agregue al flujo de trabajo, haga clic con el botón derecho en la actividad, luego vaya a propiedades y pegue "DropLocation" (Expresión VB) en la propiedad "BinaryLocation".
NOTA: Deberá crear una clase BuildEngineStub que implemente la interfaz IBuildEngine para usar la tarea MSBuild. Esto es lo que utilicé
public class BuildEngineStub : IBuildEngine
{
#region IBuildEngine Members
public bool BuildProjectFile(string projectFileName, string[] targetNames,
IDictionary globalProperties,
IDictionary targetOutputs)
{
throw new NotImplementedException();
}
public int ColumnNumberOfTaskNode
{
get { return 0; }
}
public bool ContinueOnError
{
get { return false; }
}
public int LineNumberOfTaskNode
{
get { return 0; }
}
public string ProjectFileOfTaskNode
{
get { return ""; }
}
public void LogCustomEvent(CustomBuildEventArgs e)
{
Console.WriteLine("Custom: {0}", e.Message);
}
public void LogErrorEvent(BuildErrorEventArgs e)
{
Console.WriteLine("Error: {0}", e.Message);
}
public void LogMessageEvent(BuildMessageEventArgs e)
{
Console.WriteLine("Message: {0}", e.Message);
}
public void LogWarningEvent(BuildWarningEventArgs e)
{
Console.WriteLine("Warning: {0}", e.Message);
}
#endregion
}