Visual studio 2019 不会自动从 .csproj 文件创建文件夹结构
Visual studio 2019 not automatically creating folder structure from .csproj files
我注意到 Visual Studio 2017 和 Visual Studio 2019 之间的行为存在细微差别。当我使用 VS 2017 打开解决方案时,它会自动创建项目文件中提到的文件夹(例如<Folder Include="Data\">
在 .csproj
文件中)。 Visual Studio 2019 年不会那样做。有没有办法在 Visual Studio 2019 中更改此行为,以便在这些文件夹不存在时也创建这些文件夹?
编辑:
我首先注意到这个问题是结合 TFVC 的。当其他人将空文件夹添加到他们的解决方案时,它会被添加到 .csproj 文件中,但在空文件夹中检查它时会被忽略。当我从 TFVC 获取该项目并使用 VS 2017 打开它时,文件夹会自动创建,但不会使用 VS 2019。
我希望创建这些文件夹,因为检查它们的人希望它们在那里。 TFVC 不能处理空文件夹,所以 VS 2017 解决了这个问题对我来说似乎很好。不幸的是,VS 2019 的行为似乎略有不同。
重现:
- 在 Visual Studio 2017 或 2019
中创建一个 c# Class 库(.NET 框架)版本 4.7.2 项目
- 关闭解决方案并编辑 .csproj 文件
- 添加一个包含不存在的文件夹的项目组。最终结果可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>81fa1651-0a21-4ed6-8626-763141ab67cf</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TestDotNetFramework</RootNamespace>
<AssemblyName>TestDotNetFramework</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System"/>
<Reference Include="System.Core"/>
<Reference Include="System.Xml.Linq"/>
<Reference Include="System.Data.DataSetExtensions"/>
<Reference Include="Microsoft.CSharp"/>
<Reference Include="System.Data"/>
<Reference Include="System.Net.Http"/>
<Reference Include="System.Xml"/>
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<!-- I added these manually -->
<ItemGroup>
<Folder Include="TestFolder\" />
<Folder Include="TestFolder2\Testing\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
- 保存 .csproj 文件
- 用Visual Studio2017打开解决方案。你会看到你在ItemGroup中添加的文件夹是自动创建的。
- 删除这些文件夹并使用 Visual Studio 2019 打开解决方案。文件夹不会自动创建。
我想你可能误会了。在 VS2017 中,如果我创建一个新的 .NET Core 控制台应用程序项目,然后编辑项目文件以包含:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="NonExistent" />
</ItemGroup>
</Project>
然后解决方案资源管理器显示:
并且 Windows Explorer 显示:
这与 VS2019 中的行为相同。
我身边的情况我也遇到过。而且好像只有VS2017上的net framework项目才能实现。和 net core 项目,同样,VS2019 上的 net framework 无法通过 Folder Include
从 csproj
文件创建真实文件夹。
我无法解释I have reported it to our DC Forum。如果我没有详细描述问题,您可以投票或添加任何评论。
由于票证可能需要很长时间,作为解决方法,您可以在 VS2019 的 csproj
文件中使用这些:
<ItemGroup>
<Folder Include="TestFolder"/>
</ItemGroup>
<Target Name="CreateAppDataFolder" BeforeTargets="PrepareForBuild">
<MakeDir Directories="$(ProjectDir)TestFolder" />
</Target>
我注意到 Visual Studio 2017 和 Visual Studio 2019 之间的行为存在细微差别。当我使用 VS 2017 打开解决方案时,它会自动创建项目文件中提到的文件夹(例如<Folder Include="Data\">
在 .csproj
文件中)。 Visual Studio 2019 年不会那样做。有没有办法在 Visual Studio 2019 中更改此行为,以便在这些文件夹不存在时也创建这些文件夹?
编辑: 我首先注意到这个问题是结合 TFVC 的。当其他人将空文件夹添加到他们的解决方案时,它会被添加到 .csproj 文件中,但在空文件夹中检查它时会被忽略。当我从 TFVC 获取该项目并使用 VS 2017 打开它时,文件夹会自动创建,但不会使用 VS 2019。
我希望创建这些文件夹,因为检查它们的人希望它们在那里。 TFVC 不能处理空文件夹,所以 VS 2017 解决了这个问题对我来说似乎很好。不幸的是,VS 2019 的行为似乎略有不同。
重现:
- 在 Visual Studio 2017 或 2019 中创建一个 c# Class 库(.NET 框架)版本 4.7.2 项目
- 关闭解决方案并编辑 .csproj 文件
- 添加一个包含不存在的文件夹的项目组。最终结果可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>81fa1651-0a21-4ed6-8626-763141ab67cf</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TestDotNetFramework</RootNamespace>
<AssemblyName>TestDotNetFramework</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System"/>
<Reference Include="System.Core"/>
<Reference Include="System.Xml.Linq"/>
<Reference Include="System.Data.DataSetExtensions"/>
<Reference Include="Microsoft.CSharp"/>
<Reference Include="System.Data"/>
<Reference Include="System.Net.Http"/>
<Reference Include="System.Xml"/>
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<!-- I added these manually -->
<ItemGroup>
<Folder Include="TestFolder\" />
<Folder Include="TestFolder2\Testing\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
- 保存 .csproj 文件
- 用Visual Studio2017打开解决方案。你会看到你在ItemGroup中添加的文件夹是自动创建的。
- 删除这些文件夹并使用 Visual Studio 2019 打开解决方案。文件夹不会自动创建。
我想你可能误会了。在 VS2017 中,如果我创建一个新的 .NET Core 控制台应用程序项目,然后编辑项目文件以包含:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="NonExistent" />
</ItemGroup>
</Project>
然后解决方案资源管理器显示:
并且 Windows Explorer 显示:
这与 VS2019 中的行为相同。
我身边的情况我也遇到过。而且好像只有VS2017上的net framework项目才能实现。和 net core 项目,同样,VS2019 上的 net framework 无法通过 Folder Include
从 csproj
文件创建真实文件夹。
我无法解释I have reported it to our DC Forum。如果我没有详细描述问题,您可以投票或添加任何评论。
由于票证可能需要很长时间,作为解决方法,您可以在 VS2019 的 csproj
文件中使用这些:
<ItemGroup>
<Folder Include="TestFolder"/>
</ItemGroup>
<Target Name="CreateAppDataFolder" BeforeTargets="PrepareForBuild">
<MakeDir Directories="$(ProjectDir)TestFolder" />
</Target>