6

在构建多项目解决方案时,是否有任何方法可以为 msbuild 指定仅适用于一个项目(即项目级别而不是解决方案级别)的命令行参数?

我问的原因是因为我想启用单击一次部署的并行安装。让我举个例子:

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,所以这是一次点击构建
  • 这是一个多项目解决方案,即使我只是针对一个 csproj 文件,它也会这样构建。

我知道示例 2失败的原因是因为它使用传入的程序集名称重命名每个项目的 AssemblyName ,即MyProj.Test。这是有道理的,因为通过命令行传入的参数是全局的,但我再次只针对 csproj 文件。

无论如何,这就是发生的事情。那么有什么方法可以传入 msbuild 命令行参数来仅更改 MyProj.Shell.csproj 文件中的一个 AssemblyName 属性?

4

1 回答 1

17

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

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

因此,当您构建有问题的项目时,您只需要将此项目ThisProjectNameOverrideAssemblyName的覆盖传递给您:AssemblyName

msbuild /p:ThisProjectNameOverrideAssemblyName=NewAssemblyName
于 2013-03-23T21:47:55.920 回答