10

MSBUILD スクリプトを使用してパブリッシュを作成しています。次のようになります。

msbuild "<Project>.vbproj" 
          /t:Publish 
          /p:Configuration=Release 
          /p:ProductName="<Application Name> - <Region Name>" 
          /p:PublishDir="<Region Specific>"

これまでのところ、これは適切に機能しています。

MSBUILD を使用して、一緒にインストールできる異なる場所に複数のパブリッシュを作成することはできますか? ClickOnce では、アプリケーションが同じ場合、既定では別の場所からアプリケーションをインストールできないことを知っています (アセンブリ名を使用してこれを判断すると思います)。

ここでこのスレッドを確認しました:

配置 ID は異なるが、アプリケーション ID は同じである複数の ClickOnce インストール

そのため、これを行うようにスクリプトを変更しました。

msbuild "<Project>.vbproj" 
          /t:Publish 
          /p:Configuration=Release 
          /p:ProductName="<Application Name> - <Region Name>" 
          /p:PublishDir="<Region Specific Unc>"
          /p:AssemblyName="<Application Name>_<Region Name>"

ただし、大量のエラー (1300 以上など) が発生しますが、何が起こっているのかわかりません。しかし、Visual Studio でアセンブリ名を変更してビルドすると、すべて問題ありません。

何かご意見は?

4

2 に答える 2

12

何が起こるかというと、AssemblyName プロパティが、メイン プロジェクトの依存関係のチェーンで msbuild がビルドするすべてのプロジェクトでオーバーライドされているということです。そのため、多くのコンパイル エラーが発生しています。ビジュアル スタジオを使用して assemblyName を変更すると、メイン プロジェクトのみが変更され、正しくビルドできるようになります。私のプロジェクトの 1 つで、OverridenAssemblyName というメインの .vbproj ファイルにプロパティを追加し、OverridenAssemblyName が null でない場合は AssemblyName = OverridenAssemblyName を設定しました。そうすれば、プロジェクトのみに AssemblyName を設定して、他のプロジェクトをそのまま維持して公開できます。

編集:

2 つのプロジェクトがあるシナリオを想像してみましょう。公開するプロジェクトであるプロジェクト A と、プロジェクト A によって参照されるプロジェクト B です。.vbproj ファイル内には、次のようなタグがあります<AssemblyName>YourProjectName</AssemblyName>。したがって、プロジェクト A ファイルには が<AssemblyName>Project A</AssemblyName>あり<AssemblyName>Project B</AssemblyName>、プロジェクト B には.

そのタグは、ビルド中にプロジェクト用に作成されるアセンブリの名前を定義するものです。

/p:AssemblyName="<Application Name>_<Region Name>"msbuild コマンド ラインを渡す と、ビルド プロセスで各プロジェクトのタグ AssemblyName が上書きされます。また、そのプロパティはプロジェクトのアセンブリ名を定義するものであるため、すべてのプロジェクトでアセンブリが同じ名前で生成されます。それがおそらくあなたの問題の原因です。

考えられる解決策は、次のことです。

  1. これをメイン プロジェクト (公開するプロジェクト) に追加します。

    <PropertyGroup Condition="$(PublishAssemblyName) != ''"> <AssemblyName>$(PublishAssemblyName)</AssemblyName> </PropertyGroup>

  2. コマンドラインを次のように変更します。

msbuild "<Project>.vbproj" /t:Publish /p:Configuration=Release /p:ProductName="<Application Name> - <Region Name>" /p:PublishDir="<Region Specific Unc>" /p:PublishAssemblyName="<Application Name>_<Region Name>"

お役に立てば幸いです。

于 2013-11-18T13:27:22.110 に答える
2

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
于 2013-11-25T20:46:27.747 に答える