MSBuild 16.9.NETCore3.1-OutDir-isn';t搜索依赖项

MSBuild 16.9.NETCore3.1-OutDir-isn';t搜索依赖项,msbuild,visual-studio-2019,csproj,Msbuild,Visual Studio 2019,Csproj,我试图在powershell脚本中使用MSBuild在完整的应用程序套件中构建许多项目和解决方案。我将OutDir的参数设置为指向单个二进制文件目录,并从一个有效的输出角度进行设置 但是,文档说明OutDir包含在AssemblySearchPath中。但是查看日志,MSBuild显然无法使用csproj文件中的hintpath。我也尝试过设置额外的libpath,但没有成功。这似乎也是从VisualStudio2019构建的问题。我的HintPath指向一个公共调试目录。发布版本仍在调试目录中

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

但是,文档说明OutDir包含在AssemblySearchPath中。但是查看日志,MSBuild显然无法使用csproj文件中的hintpath。我也尝试过设置额外的libpath,但没有成功。这似乎也是从VisualStudio2019构建的问题。我的HintPath指向一个公共调试目录。发布版本仍在调试目录中查找。这在.NET Framework时代的旧版本Studio中适用。它在较旧的TFS XAML构建中将输出位置设置为“SingleFolder”时起作用

我还使用了OutDir路径来结束各种数量的反斜杠。我怀疑这个老问题已经解决了

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

编辑: 根据已接受的答案,将OutDir添加到AssemblySearchPaths中可以实现这一目的。对我来说,我创建了一个proj文件,并将其添加到每个.NET核心csproj文件中。我的想法是,当这得到修复,我可以删除一个地方的调整

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

$(汇编搜索路径)$(OutDir)
我的HintPath指向一个公共调试目录。发布版本仍然存在 在调试目录中查找

outdir
始终是输出文件夹,它不区分
Release
Debug
。因此,您必须使用
C:\ttt\$(配置)\
来区分它们

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

仅在
csproj
中修改系统属性
outdir
仅在生成过程中生效,但系统属性仍在生成开始前读取,并且
assemblySearchPath
属性读取以前的
outdir
属性。因此,在修改之前,您总是采用默认值

您必须使用
目录.Build.props
文件,它设置的值早于msbuild start

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

2)在文件中添加类似的
outdir
属性

<Project>

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

</Project>

更新1 我认为这是网络核心项目的一个问题

我之前所说的是针对和IDE构建的。现在对于MSBuild命令行,这是另一种情况

对于非sdk网络框架项目

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

嗯。正如我们所希望的那样,它工作得很完美

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

您应该注意,
assemblySearchPath
无法识别
AdditionalLibPath

当我在以下情况下使用此选项时:

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

您应该注意,
assemblySearchPath
属性列表下没有
AdditionalLibPath
的属性。而且它也不适用于网络核心项目

简言之,对于网络核心项目来说,这无疑是一个相当大的问题。我还修改了DC票证

现在,对于新的sdk网络核心项目,

因为您使用了msbuild命令行来设置属性,所以不需要直接使用
.Build.props
文件。MSbuild命令行属性分配实际上与文件的效果相同

<Project>

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

</Project>
另外
组装搜索路径
仅未准备就绪。你可以修改它。实际上,所有msbuild属性都可以被覆盖,这是msbuild的一个灵活特性

总之,您仍然必须使用
汇编搜索路径

解决方案

由于团队在net core项目中的这一细节存在一些问题,我们可以使用MSbuild的灵活性手动修改以获得我们想要的:

1)直接使用
放弃.Build.props
文件,并继续在net core csproj文件中添加这些:

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

我理解您关于OutDir的说法,即不考虑发布或调试配置。我直接从powershell调用MSBuild,并将/p:OutDir=D:\Temp\MSBuild\binDirDev\\n直接指定为命令行参数。我还编辑了这篇文章,以表明我使用了附加的libpath,而不是只读的assemblySearchPath。我认为这也是VS的Dev命令下的一个问题。由于msbuild是灵活的,因此可以扩展
assemblySearchPath
属性。请检查我的详细更新答案。@JohnDyer,
,因为这是一个相当大的问题,我们无法在这里进一步处理,并且必须等待团队的回复,所以我建议您可以接受此答案,以使其他社区成员对此问题有一个正确的方向。
,我将按照链接告诉您任何进展。如果你想及时得到你想要的。你必须使用我的变通方法。你这么做真是太好了。
msbuild xxx\xxx.csproj -p:Outdir=c:\ttt -v:diagnostic