我正在使用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>"
希望对您有所帮助。