在更改AssemblyName时,Msbuild命令行参数是针对项目级别而非解决方案级别的。

6
有没有办法在构建多项目解决方案时为msbuild指定一个仅适用于一个项目(即项目级别而不是解决方案级别)的命令行参数?
我之所以这样问,是因为我想启用click-once部署的并行安装。让我举个例子:
1)这个可以工作
MSBuild "C:\Dev\MyProj\MyProj.Shell\MyProj.Shell.csproj" /p:SkipInvalidConfigurations=true /target:publish /p:OutputPath="C:\Dev\Temp\" /p:ApplicationVersion=1.2.3.4 /p:ProductName="My Proj" /p:Configuration="Release" /p:Platform="Mixed Platforms" /verbosity:diagnostic
2)这个不行
MSBuild "C:\Dev\MyProj\MyProj.Shell\MyProj.Shell.csproj" /p:SkipInvalidConfigurations=true /target:publish /p:OutputPath="C:\Dev\Temp\" /p:ApplicationVersion=1.2.3.4 /p:ProductName="My Proj Test" /p:Configuration="Release" /p:Platform="Mixed Platforms" /verbosity:diagnostic /p:AssemblyName="MyProj.Test"
只是为了澄清和重申一些要点:
- 1和2之间唯一的区别是/p:AssemblyName="MyProj.Text" - 我使用/target:publish,所以这是一个click-once构建 - 这是一个多项目解决方案,即使我只针对一个csproj文件进行定位,它也会按此方式构建。
我知道示例2失败的原因是因为它使用传入的程序集名称重命名了每个项目的AssemblyName,即MyProj.Test。这在某种程度上是有道理的,因为通过命令行传递的参数是全局的,但我只针对csproj文件进行定位。无论如何,这就是发生的事情。那么有没有办法传递一个msbuild命令行参数以仅更改MyProj.Shell.csproj文件中的一个AssemblyName属性呢?
1个回答

17

如果指定了特定属性,您可以在问题中编辑项目(其 .csproj 文件),以从该特殊属性获得程序集名称,即:

您可以在问题的项目(其 .csproj文件)中编辑,以从特定属性获取程序集名称,例如:

<AssemblyName Condition=" '$(ThisProjectNameOverrideAssemblyName)' == '' " >UsualAssemblyName</AssemblyName>
<AssemblyName Condition=" '$(ThisProjectNameOverrideAssemblyName)' != '' " >$(ThisProjectNameOverrideAssemblyName)</AssemblyName>

在构建你的项目时,你可以传递 ThisProjectNameOverrideAssemblyName 来仅覆盖此项目的 AssemblyName

msbuild /p:ThisProjectNameOverrideAssemblyName=NewAssemblyName

1
谢谢Isantipov,这是一个合法的可能性,但是我正在寻找一种通用的方法来为项目执行此操作,而不需要修改csproj文件。我怀疑答案很简单,“不,你不能这样做”。 - SDK
1
我试了两天都没搞明白。不明白为什么它不起作用,所以非常感谢你们能够充分理解问题并正确提出问题以及给出答案! - russelrillema
这真的救了我。我已经投入了大量工作来设置一个CI / CD流程,为了在win forms应用程序中需要并排安装win forms。问题是解决方案是一个多项目解决方案,我覆盖的属性被应用于所有依赖项目,导致构建失败。https://stackoverflow.com/questions/55447528/building-a-win-forms-application-with-dependent-projects-and-overriding-publish - JDBennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接