MSBuild 16.9 .NET Core 3.1 - 不在 OutDir 中搜索依赖项

MSBuild 16.9 .NET Core 3.1 - OutDir isn't searched for dependencies

我正在尝试在 powershell 脚本中使用 MSBuild 在完整的应用程序套件中构建许多项目和解决方案。我将 OutDir 的参数设置为指向单个二进制文件目录,并且从有效的输出角度来看。

但是文档指出 OutDir 包含在 AssemblySearchPaths 中。但是查看日志 MSBuild 显然是使用 csproj 文件中的提示路径卡住了。我也尝试设置 AdditionalLibPaths 但没有成功。这似乎也是从 Visual Studio 2019 年开始构建的问题。我的提示路径指向一个公共调试目录。发布版本仍然在调试目录中查找。这曾经在 .NET Framework 时代的旧版本 Studio 中工作。它在旧的 TFS XAML 构建中工作,将输出位置设置为“SingleFolder”

我也玩过 OutDir 路径结束各种数量的反斜杠。我怀疑这个老问题已经解决了。

如何让 MSBuild 为依赖项使用备用目录?

https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2019

编辑: 根据接受的答案,将 OutDir 添加到 AssemblySearchPaths 就可以了。对我来说,我创建了一个 proj 文件,并将其添加到每个 .NET Core csproj 文件中。我的想法是,当这个问题得到解决时,我可以在一个地方删除调整。

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <AssemblySearchPaths>$(AssemblySearchPaths);$(OutDir)</AssemblySearchPaths>
</PropertyGroup>

My hintpaths point to a common debug directory. A release build still looks in the debug directory.

outdir始终是输出文件夹,不区分ReleaseDebug。所以你要用<OutDir>C:\ttt$(Configuration)\</OutDir>来区分它们。

实际上,系统 msbuild 属性的读取早于构建任务的开始。您必须在构建过程开始之前设置属性。

csproj中简单修改系统属性outdir只会在构建过程中生效,但系统属性在构建开始前仍然会被读取,同样AssemblySearchPaths属性阅读前面的outdir属性。所以你修改前总是取默认值。

您必须使用 Directory.Build.props 文件,它在 msbuild 启动之前设置值。

1) 在您的项目文件夹下创建一个名为 Directory.Build.props 的文件。

2)outdir 属性 添加到文件中。

<Project>

<PropertyGroup>
   <OutDir>C:\ttt$(Configuration)\</OutDir>
</PropertyGroup>

</Project>

3)重启VS启用

但是,我注意到它在 non-sdk net framework 个项目中运行良好,但未在 new-sdk net core 个项目下列出。

non-sdk 网络框架项目

new-sdk 网络核心项目

不确定这是一个问题还是团队忘记了它。总之,I have reported it to our DC Forum。如果我没有详细描述,您可以投票或添加任何评论。

作为解决方法,您可以尝试为 AssemblySearchPaths 属性.

设置新值

为了不丢失 AssemblySearchPaths 的原始值,您必须将其添加到 csporj 文件而不是 Directory.Build.props 文件。

只需将这些添加到 csproj 文件中:

<PropertyGroup>
    <AssemblySearchPaths>$(AssemblySearchPaths);$(OutDir)</AssemblySearchPaths>
</PropertyGroup>

更新 1

我认为这是网络核心项目的问题。

前面说的是针对VS IDE build。现在MSBuild Command Line又是另外一种情况了

对于 non-sdk 网络框架项目

当我使用 msbuild xxx\xxx.csproj -p:outdir=c:\ttt -v:diagnostic 时,显示如下:

嗯。它如我们所愿完美运行。

但是,当我们对new-sdk net core项目使用相同的命令行时,它什么也不做。所以我认为这对于网络核心项目来说是一个相当大的问题。

你应该注意到 AdditionalLibPaths 不能被 AssemblySearchPaths 识别。

我用这个在 :

 msbuild xxx\xxx.csproj -p:AdditionalLibPaths=c:\ttt -v:diagnostic

你要注意AssemblySearchPaths属性的列表下没有AdditionalLibPaths的属性。而且它也不适用于网络核心项目。

总之,对于net core项目来说,这无疑是个问题。我也修改了DC票。

现在 new-sdk 网络核心项目,

因为你使用msbuild命令行来设置属性,所以不需要使用Directly.Build.props文件。 MSbuild命令行属性赋值其实是文件一样的效果

还有AssemblySearchPaths不是ready-only。你可以修改它。实际上,所有 msbuild 属性都可以被覆盖,这是 MSBuild 的一项灵活功能。

综上,还是得用AssemblySearchPaths.

解决方案

由于 Team在net core项目中这个细节有些问题,我们可以利用MSbuild的灵活性手动修改得到我们想要的:

1) 放弃使用 Directly.Build.props 文件并继续在网络核心 csproj 文件中添加这些:

 <PropertyGroup>
        <AssemblySearchPaths>$(AssemblySearchPaths);$(OutDir)</AssemblySearchPaths>
  </PropertyGroup>

2) 对 net core 项目使用以下命令行:

msbuild xxx\xxx.csproj -p:Outdir=c:\ttt -v:diagnostic