MSBuild 16.9.NETCore3.1-OutDir-isn';t搜索依赖项
我试图在powershell脚本中使用MSBuild在完整的应用程序套件中构建许多项目和解决方案。我将OutDir的参数设置为指向单个二进制文件目录,并从一个有效的输出角度进行设置 但是,文档说明OutDir包含在AssemblySearchPath中。但是查看日志,MSBuild显然无法使用csproj文件中的hintpath。我也尝试过设置额外的libpath,但没有成功。这似乎也是从VisualStudio2019构建的问题。我的HintPath指向一个公共调试目录。发布版本仍在调试目录中查找。这在.NET Framework时代的旧版本Studio中适用。它在较旧的TFS XAML构建中将输出位置设置为“SingleFolder”时起作用 我还使用了OutDir路径来结束各种数量的反斜杠。我怀疑这个老问题已经解决了 如何让MSBuild为依赖项使用备用目录 编辑: 根据已接受的答案,将OutDir添加到AssemblySearchPaths中可以实现这一目的。对我来说,我创建了一个proj文件,并将其添加到每个.NET核心csproj文件中。我的想法是,当这得到修复,我可以删除一个地方的调整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指向一个公共调试目录。发布版本仍在调试目录中
<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