用于更改AssemblyName的项目级别的Msbuild命令行参数而不是解决方案级别

时间:2013-03-21 16:55:01

标签: command-line msbuild clickonce

在构建多项目解决方案时,有没有办法为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   平台“/详述:诊断

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 =“我的Proj测试”/ p:配置=“发布”   / p:平台=“混合平台”/详细程度:诊断   /p:AssemblyName="MyProj.Test“

只是澄清并重申几点:

  • 1& 1之间的唯一区别2是/p:AssemblyName="MyProj.Text"
  • 我正在使用/target:publish所以这是一次点击构建
  • 这是一个多项目解决方案,即使我只是针对csproj文件,它也会这样构建。

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

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

1 个答案:

答案 0 :(得分:14)

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

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

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

msbuild /p:ThisProjectNameOverrideAssemblyName=NewAssemblyName