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
的更多详细信息。
好的,这是我的问题,我有 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
的更多详细信息。