2009-09-26 13 views
6

私はMageへの言及を見続けていますが、具体的に何が役立つのか、それがなぜ有用であるのかは分かりません。もし誰かがそれについての素早い説明を与えることができれば、それは非常に高く評価されるだろう! 〜Mageとはどのような意味で有用ですか?

答えて

6

Mage.exe

おかげで、マニフェストの生成および.NET Frameworkアプリケーションの編集コマンドラインツールです。 UIバージョンもありますMageUI.exe

通常は、ClickOnce deployment manifestsを手動で作成しています。

9

ミッチ小麦は偉大な答えを与えた署名ClickOnceアプリケーションのために使われている、とあなただけのメイジで出始めている場合は、は、彼が与える最後のリンクを読んでください!

他の人にClickOnceプロジェクトを手助けするための実際のコードをいくつか共有したいと思います。私は、MSBUILD from the command-line to "create" the deploymentを使用すると自動ビルドプロセスに最適であることを発見しました。 I 決して Visual Studioからパブリッシュウィザードを実行します。しかし、VSの[パブリッシュ]タブのすべての情報を指定しているので、コマンドラインから実行する必要はありません。たとえば、 "アプリケーションファイル"は、私がコマンドラインで行う方法を知らないものです。

アプリケーションが正常にサーバーにデプロイされた後THEN ...私は1つのサーバーから別の(例えば試験 - > Staging->生産)へのClickOnce配置の私の移行の一環として、「メイジ」を使用

例えば(CruiseControlのジョブから実行しているソリューションを構築するPowerShellスクリプト):

&"$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/" 

その後、あなたは「TESTSERVER」から「QAServer」または「ステージング」または「生産にあなたのClickOnceアプリケーションを移行するとき"...そうするためには複雑なスクリプトを書く必要があります。ここに私が思いついたものがあります:

######################################################################################### 
# 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

PowerShellスクリプトは素晴らしいです!それほどありがとうございました。 –

関連する問題