2009-09-26 24 views

Respuesta

6

Mage.exe es una Generación Manifiesto y la línea de comandos de edición de herramientas para aplicaciones .NET Framework. También hay una versión de la interfaz de usuario MageUI.exe

Un uso típico es crear manualmente su ClickOnce deployment manifests.

0

Se utiliza para aplicaciones de firma ClickOnce

9

Mitch Trigo dio una gran respuesta, y si usted está empezando a cabo con Mago, leer el último eslabón que da!

Quería compartir un código real para ayudar a otros con sus proyectos ClickOnce. Descubrí que usar MSBUILD from the command-line to "create" the deployment es perfecto para un proceso de construcción automatizado. I nunca ejecutar el asistente de publicación desde Visual Studio. Aunque, sí especifico casi toda la información en la pestaña Publicar en VS, para que no tenga que hacerlo desde la línea de comandos. Por ejemplo, "Archivos de aplicación" es algo que no sé cómo hacer en la línea de comandos.

Luego, después de la aplicación se implementa con éxito al servidor ... Yo uso "Mago", como parte de mi migración de la implementación de ClickOnce desde un servidor a otro (por ejemplo Testing-> Staging-> Producción)

Por ejemplo (un script de PowerShell que se basa la solución que va desde un trabajo climatizador):

&"$Env:windir\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe" "C:\Projects\MyCoolApp.sln" /t:clean /t:publish /p:Configuration=Release /p:ApplicationRevision=$Env:CCNETLABEL /p:PublishDir="\\TestServer\MyCoolAppFolder/" /p:PublishUrl="\\TestServer\MyCoolAppFolder/" 

Luego, más tarde, cuando se desea migrar su aplicación ClickOnce de "TestServer" a "QAServer" o "puesta en escena" o "Producción "... necesitarías escribir un guión complicado para hacer eso. Esto es lo que se me ocurrió:

######################################################################################### 
# PowerShell Script to Migrate a ClickOnce Deployment from one server to another. 
# This is my first attempt at PowerShell... pardon the bad or incorrect code. :-) 
# To run a PowerShell script from CruiseControl.Net: 
# http://www.cruisecontrolnet.org/projects/ccnet/wiki/PowerShell_Task 
# NOTE: When doing the initial build, ensure that the ProviderURL and ProviderDir are set. 
######################################################################################### 

$SourceDir = "\\TestServer\MyCoolAppFolder" 
$DestDir = "\\StagingServer\MyCoolAppFolder" 
$DeploymentManifestName = "MyCoolApp.application" 
$DeploymentDestUrl = "file://StagingServer/MyCoolAppFolder" 

# If your application is one that connects to a database, then likely you want it to point 
# to a different database depending what environment it's been deployed to. 
# I use a SQL Server connection for this example. 
$ConnStringName = "MyCoolAppConnectionString" 
$ConnStringValue = "data source=StagingServerInstance;Initial Catalog=MyCoolAppDB;persist security info=True;user id=Gregg;password=Gregg" 

# Unfortunately, you *must* specify the publisher when doing Mage, even though you specified it 
# when you did the original publish, otherwise Mage will change the Publisher value to the 
# name of your Application. A bug in Mage I suspect. 
$Publisher = "Gregg Cleland" 

# Risk: This next line assumes that the pfx certificate file is readily available. 
# Just be certain it's the same key you used when you published originally. 
$AuthenticationKeyPath = "C:\Projects\MyCoolApp\MyCoolApp_TemporaryKey.pfx" 

# Note: This references the .NET 3.5 version of mage... the .NET 4.0 version of mage.exe can be found at: 
# C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe 
$MAGE = "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\mage.exe" 

######################################################################################### 
# Start off at the source location. 
Set-Location $SourceDir 

######################################################################################### 
# Get the application manifest directory name and application manifest file name. 
[xml]$doc = Get-Content $DeploymentManifestName 
$ns = New-Object Xml.XmlNamespaceManager $doc.NameTable 
$ns.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1") 
$ns.AddNamespace("asmv2", "urn:schemas-microsoft-com:asm.v2") 
$xpath = "/asmv1:assembly/asmv2:dependency/asmv2:dependentAssembly" 
$appManifestPath = $doc.SelectSingleNode($xpath, $ns).codebase # Example: = "Application Files\MyCoolApp_1_0_0_5\MyApp.exe.manifest" 
$position = $appManifestPath.LastIndexOf('\'); 
$appManifestDir = $appManifestPath.SubString(0, $position); # Example: "Application Files\MyCoolApp_1_0_0_5" 
$appManifestFile = $appManifestPath.SubString($position + 1); # Example: "MyCoolApp.exe.manifest" 

######################################################################################### 
# Copy the deployment files and the latest application files to destination. 
# Note: Do not forget to ensure the CruiseControl Service Logon has permissions to write to destination! 
# Todo: If robocopy fails, throw "robocopy failed!" Most likely it is an Error 5, Access Denied 
# b/c the CruiseControl Service logon account doesn't have permission to copy to create/write to destination. 
$CurrentDir = "$DestDir\$appManifestDir" 
robocopy "$SourceDir" "$DestDir" /XO 
robocopy "$SourceDir\$appManifestDir" $CurrentDir /MIR /XO 

######################################################################################### 
# Now that we have copied the latest build, let us navigate down into the destination's 
# application manifest directory and do some work. 
Set-Location $CurrentDir 

######################################################################################### 
# Remove the .deploy extension from all files. (Mage will throw an exception if you don't do this) 
Get-ChildItem -Include *.deploy -Recurse | Rename-Item -NewName { [System.IO.Path]::ChangeExtension($_.Name, "") } 

######################################################################################### 
# Modify the XML in the app.config file per your needs (e.g. change the connectionStrings) 
[xml]$doc = Get-Content $AppConfigFileName 

$node = $doc.SelectSingleNode("configuration/connectionStrings/add[@name='$ConnStringName']") 
$node.connectionString = $ConnStringValue 

$xmldocPath = $PWD.ProviderPath # hack to avoid getting the silly namespace prefixed to the path for UNC paths 
$doc.Save("$xmldocPath\$AppConfigFileName") # For some reason, seems to require the fully qualified path 

######################################################################################### 
# Finally... We get to the part where we use MAGE! 
# Use MAGE to update the application manifest hash and sign it. 
&"$MAGE" -Update $appManifestFile -FromDirectory "$CurrentDir" -CertFile $AuthenticationKeyPath 

######################################################################################### 
# Re-Add the ".deploy" extension to all files EXCEPT those that end in "application" or 
# "manifest". Do this AFTER signing. 
Get-ChildItem -Recurse | Where-Object { !$_.PSIsContainer -and !$_.Name.EndsWith(".application") -and !$_.Name.EndsWith(".manifest") } | Rename-Item -NewName { $_.Name + ".deploy" } 

######################################################################################### 
# Finally, go back up to the Deployment folder and update the deployment manifest 
Set-Location "..\..\" 
&"$MAGE" -Update $DeploymentManifestName -ProviderUrl "$DeploymentDestUrl/$DeploymentManifestName" -AppManifest "$appManifestPath" -Publisher $Publisher -CertFile $AuthenticationKeyPath 
+0

que la secuencia de comandos de PowerShell es increíble! Muchas gracias por eso. –

Cuestiones relacionadas