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

Ras*_*usW 3 msbuild visual-studio-2017

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

这会导致构建输出文件夹中的每个目标框架都有一个子文件夹:

构建输出文件夹结构

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

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

msbuild projectfile.csproj

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

msbuild projectfile.csproj /p:OutDir=buildtemp

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

Mar*_*ich 6

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

将其添加到您的项目文件中PropertyGroup

<OutputPath>$(BaseOutputPath)</OutputPath>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这里的问题是 SDK 尝试OutputPath根据TargetFramework和更改属性AppendTargetFrameworkToOutputPath更改属性。但如果该值是通过 CLI 指定的,则项目逻辑无法覆盖它。

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