VS2017 Directory.Build.props不会加载整个解决方案

时间:2019-10-15 16:17:27

标签: c# visual-studio-2017 constants vsprops

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

当我们出于开发目的(内部->公共)时,我需要一个Defined常量来设置大多数类的可访问性。 我在开发项目目录中使用Directory.Build.props定义了一个变量,如果此变量存在,则库.csproj定义了一个常量。

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

我可以看到一切对我的dev proj都很好,但是对我的库却不行(他们看不到我的.props变量)

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

LibA
LibB
ProjectDelivery
ProjectDev

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

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

1 个答案:

答案 0 :(得分:0)

首先,要弄清从标题中得出的可能混淆,自动导入Directory.Build.props不是 Visual Studio 2017 功能,而是 MSBuild 15 < / em>功能( VS2019 随附)。

在我挑剔的情况下,让我们开始了解技术:

问题不是您的构建顺序。仅在您的Directory.Build.props项目中拾取ProjectDev的原因,是因为 MSBuild .csproj的目录中查找名为Directory.Build.props的文件并在找到后将其导入。如果找不到,则在父目录中搜索文件。并且它一直在父目录中寻找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;其他项目在其目录和任何父目录中都没有Directory.Build.props

要解决您的问题,您可以将Directory.Build.props文件夹上移一个,以便所有项目自动将其导入, 或者您可以通过向Directory.Build.props中添加Import元素来手动导入.csproj

<Project>
  <Import Project="..\ProjectDev\Directory.Build.props" />
</Project>

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