VS2017 Directory.Build.props 没有为整个解决方案加载

VS2017 Directory.Build.props doesn't load for whole solution

好的,这是我的问题,我有 2 个库和 2 个包含它们的 .csproj 的项目(1 个用于开发,1 个用于客户端交付)。

我需要一个定义的常量来设置我的大部分 class 当我们用于开发目的时(内部 -> public)。 我在我的开发项目目录中使用了一个 Directory.Build.props 来定义一个变量,如果这个变量存在,我的 Libraries .csproj 会定义一个常量。

<PropertyGroup Condition ="$(ActiveIHMMode)=='true'">
    <DefineConstants>$(DefineConstants);DEV_IHM_MODE</DefineConstants>
</PropertyGroup>

我可以看到我的开发项目一切正常,但它不适用于我的图书馆(他们看不到我的 .props 变量)

我想这有一个简单的原因,那就是依赖编译顺序。 我的目录层次结构如下:

LibA
LibB
ProjectDelivery
ProjectDev

我的 LibA 首先被编译并且没有找到任何 Directory.Build.props 因为我的文件在我的 ProjectDev 目录中,但是我的 ProjectDev 作为最后一个编译元素找到了它,但是对于我的 Lib 来说为时已晚。

第一次使用 .props,我找不到解决它的方法。感谢您以后的帮助。

首先,为了澄清从您的标题推断出的可能混淆,自动导入 Directory.Build.props 不是 Visual Studio 2017 功能,而是 MSBuild 15 功能(包含在 VS2019 中)。

抛开我的吹毛求疵,让我们进入技术层面:

问题不在于您的构建顺序。 Directory.Build.props 仅在您的 ProjectDev 项目中出现的原因是因为 MSBuild.csproj 的目录中查找名为 Directory.Build.props 并在找到它时导入它。如果未找到,则在 parent 目录中搜索该文件。并且它一直在 parent 目录中寻找 Directory.Build.props 直到它到达根目录,或者它确实找到该文件然后停止,所以它只会自动导入找到的第一个 Directory.Build.props

如上所述,您的项目结构如下所示:

/LibA/
/LibA/LibA.csproj

/LibB/
/LibB/LibB.csproj

/ProjectDelivery/
/ProjectDelivery/ProjectDelivery.csproj

/ProjectDev/
/ProjectDev/ProjectDev.csproj
/ProjectDev/Directory.Build.props

只有ProjectDev会自动导入Directory.Build.props; none 的其他项目在它们的目录和任何 parent 目录中都没有 Directory.Build.props

要解决您的问题,您可以将 Directory.Build.props 文件夹向上移动一个,这样它就会被您的所有项目自动导入, 或者您可以通过将 Import 元素添加到 .csproj:

来手动导入 Directory.Build.props
<Project>
  <Import Project="..\ProjectDev\Directory.Build.props" />
</Project>

您可以在 documentation 中阅读有关 Directory.Build.props 的更多详细信息。