msbuild/publish を 1 回実行してから、マニフェストが各環境に移動するたびにマニフェストを変更して再署名する別の「展開」プログラムを作成することによってのみ、成功することができました。QA にデプロイされ、新しい名前と構成ファイルが付けられます。その後、本番環境に再度「デプロイ」し、その時点で新しい名前と構成ファイルも付けます。
このプロセスでは、名前を変更して .deploy 拡張子を削除し、構成ファイルを置き換え、アプリ マニフェストを変更し、配置マニフェストを変更する必要があります (私の場合も、vsto Excel アドインを実行していたため、.xlsx ファイルを更新します)。アプリ マニフェストを再署名し、.deploy 拡張子を復元し、配置マニフェストを再署名し、最後に結果を配置場所にコピーします。
これにより、「クリック 1 回」でプログラムの追加/削除で「アプリケーション QA」が作成される QA へのデプロイと、「クリック 1 回」で「アプリケーション PROD」が作成されるプロダクション デプロイが行われます。アセンブリ名と "solutionId" GUID が各環境で異なるように更新されているため、2 つを同時に実行できます。
以下は、アプリ マニフェストと配置マニフェストを変更して、各環境で一意の名前を付ける方法に関するコードです。このアプローチを決定し、辞任するためのコードも必要な場合は、私がお手伝いできます。
Private Function UpdateAppManifestBasedOnTarget(caller As IReleaseExecutionCaller, appName As String, appManifestFileInfo As IO.FileInfo) As String
Log.Write(Me.Name, String.Format("update the app manifest based on the target environment..."))
Dim appManifestXML As New Xml.XmlDocument()
Dim appManifestNamespaces As New Xml.XmlNamespaceManager(appManifestXML.NameTable)
appManifestNamespaces.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1")
appManifestNamespaces.AddNamespace("vstav3", "urn:schemas-microsoft-com:vsta.v3")
appManifestNamespaces.AddNamespace("vstov4", "urn:schemas-microsoft-com:vsto.v4")
appManifestXML.Load(appManifestFileInfo.FullName)
'assemblyIdentity
Dim assemblyNode = appManifestXML.SelectSingleNode("/asmv1:assembly/asmv1:assemblyIdentity", appManifestNamespaces)
assemblyNode.Attributes("name").Value = appName & "-" & caller.Release.EnvironmentCode & ".dll"
'description
Dim descNode = appManifestXML.SelectSingleNode("/asmv1:assembly/asmv1:description", appManifestNamespaces)
descNode.InnerXml = appName & "-" & caller.Release.EnvironmentCode
'soluionid guid
Dim custNode = appManifestXML.SelectSingleNode("/asmv1:assembly/vstav3:addIn/vstav3:application/vstov4:customizations/vstov4:customization/vstov4:document", appManifestNamespaces)
Dim currentGUID = custNode.Attributes("solutionId").Value
Dim newGuid As String = String.Format("{0:x8}{1}", caller.Release.EnvironmentCode.ToLower.GetHashCode(), currentGUID.Substring(8))
custNode.Attributes("solutionId").Value = newGuid
appManifestXML.Save(appManifestFileInfo.FullName)
Return newGuid
End Function
Private Sub UpdateDeploymentManifestBasedOnTarget(caller As IReleaseExecutionCaller, appName As String, vstoFileInfo As IO.FileInfo)
Log.Write(Me.Name, String.Format("update the deployment manifest based on the target environment..."))
Dim vstoXML As New Xml.XmlDocument
Dim vstoManifestNamespaces As New Xml.XmlNamespaceManager(vstoXML.NameTable)
vstoManifestNamespaces.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1")
vstoManifestNamespaces.AddNamespace("asmv2", "urn:schemas-microsoft-com:asm.v2")
vstoXML.Load(vstoFileInfo.FullName)
'assemblyIdentity
Dim assemblyNode = vstoXML.SelectSingleNode("/asmv1:assembly/asmv1:assemblyIdentity", vstoManifestNamespaces)
assemblyNode.Attributes("name").Value = appName & "-" & caller.Release.EnvironmentCode & ".vsto"
'description
Dim descNode = vstoXML.SelectSingleNode("/asmv1:assembly/asmv1:description", vstoManifestNamespaces)
descNode.Attributes("asmv2:product").Value = appName & "-" & caller.Release.EnvironmentCode
'dependancy assemblyIdentity
Dim depAssmblyIdentityNode = vstoXML.SelectSingleNode("/asmv1:assembly/asmv2:dependency/asmv2:dependentAssembly/asmv2:assemblyIdentity", vstoManifestNamespaces)
depAssmblyIdentityNode.Attributes("name").Value = appName & "-" & caller.Release.EnvironmentCode & ".dll"
vstoXML.Save(vstoFileInfo.FullName)
End Sub