使用OutDir时,每个目标框架的子文件夹中的MSBuild输出

时间:2017-05-05 08:30:41

标签: msbuild visual-studio-2017

使用新的SDK样式csproj格式时,可以将<targetframeworks>元素用于以分号分隔的目标框架列表来构建项目。

这会在构建输出文件夹中为每个目标框架生成一个子文件夹:

build output folder structure

但是,在msbuild命令行上传递OutDir属性时,它不会创建子文件夹,并且构建的程序集都放在同一文件夹中。

有效的命令行,但不允许输出位置:

msbuild projectfile.csproj

选择输出目录的命令行,但将构建的程序集放在同一文件夹中(有效地覆盖首先构建的目标框架程序集):

msbuild projectfile.csproj /p:OutDir=buildtemp

有没有办法将构建输出放在非默认文件夹中,同时仍保留targetframwork子文件夹?

1 个答案:

答案 0 :(得分:2)

现在使用的属性是OutputPath,但是从CLI设置它会使其成为全局属性并取代输出路径的自动附加。解决方法是创建一个全局的中间属性并从项目中使用它。

将其添加到PropertyGroup

中的项目文件中
<OutputPath>$(BaseOutputPath)</OutputPath>

然后,您可以在调用构建命令时全局设置此属性:

martin.ullrich@martins-imac:~/tmp$ dotnet build /p:BaseOutputPath=bin/foo

  tmp -> /Users/martin.ullrich/tmp/bin/foo/netstandard1.4/tmp.dll
  tmp -> /Users/martin.ullrich/tmp/bin/foo/netstandard1.6/tmp.dll

此处的问题是SDK会尝试根据OutputPathTargetFramework更改AppendTargetFrameworkToOutputPath属性。但是如果通过CLI指定了​​值,则项目逻辑不能覆盖它。

另请注意,BaseOutputPath实际上在SDK默认值中使用(默认为bin\),但默认情况下会尝试附加配置名称。