我正在使用MSBUILD脚本创建发布,它看起来像这样:

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

到目前为止,这工作正常。

是否可以使用MSBUILD在可以安装在一起的不同位置创建多个发布?我知道,默认情况下,如果应用程序是相同的,则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 Studios中更改程序集名称并进行构建,则一切都很好。

有什么想法吗?

最佳答案

发生的结果是,在所有项目中都覆盖了AssemblyName属性,而msbuild在主项目的依赖链中进行了构建。这导致了很多编译错误。当您通过Visual Studio更改assemblyName时,您仅更改了主项目,从而使其能够正确构建。在我的一个项目中,我所做的是在主.vbproj文件上添加一个名为OverridenAssemblyName的属性,并在OverridenAssemblyName不为null时设置AssemblyName = OverridenAssemblyName。这样,您可以只为发布设置项目的AssemblyName,使其他项目保持完整。

编辑:

让我们想象一个场景,其中有2个项目。项目A是要发布的项目,项目B是项目A引用的项目。在.vbproj文件中,您具有类似<AssemblyName>YourProjectName</AssemblyName>的标记。因此,在项目A文件中,项目B中将具有<AssemblyName>Project A</AssemblyName><AssemblyName>Project B</AssemblyName>

该标记定义了在构建过程中为项目创建的程序集的名称。

在msbuild命令行中传递/p:AssemblyName="<Application Name>_<Region Name>"时,将覆盖构建过程中每个项目的标记AssemblyName。并且由于该属性定义了项目的程序集名称,因此所有项目都使用相同的名称来生成其程序集。那可能是造成您问题的原因。

一种可能的解决方案是执行以下操作:

  • 将此添加到您的主项目(要发布的项目)
    <PropertyGroup Condition="$(PublishAssemblyName) != ''"><AssemblyName>$(PublishAssemblyName)</AssemblyName></PropertyGroup>
  • 将您的命令行更改为此:
  • 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>"
    希望对您有所帮助。

    10-05 22:31