Visual Studio: 停止修改 CSPROJ 和自定义包含

Visual Studio: stop from modifying CSPROJ and custom includes

通过将这些行放入我的 .csproj 文件中,我已成功包含所有项目文件:

<ItemGroup>
  <Content Include="**\*.*" Exclude="**\*.cs"></Content>
</ItemGroup>

<ItemGroup>
  <Compile Include="**\*.cs" Exclude="**\*.as?x.*"></Compile>

  <Compile Include="**\*.aspx.cs">
    <SubType>ASPXCodeBehind</SubType>
  </Compile>
  <Compile Include="**\*.ascx.cs">
    <SubType>ASPXCodeBehind</SubType>
  </Compile>
  <Compile Include="**\*.aspx.designer.cs"></Compile>
  <Compile Include="**\*.ascx.designer.cs"></Compile>
</ItemGroup>

然后我使用这些行成功地将所有文件复制到另一个目录中:

<Target Name="AfterRebuild">
    <Copy SourceFiles="@(Content)" DestinationFolder="\wwwroot\%(Content.RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
<Target Name="AfterRebuild">
  <Copy SourceFiles="@(Compile)" DestinationFolder="\wwwroot\%(Compile.RecursiveDir)" SkipUnchangedFiles="true" />
</Target>

我遇到的第一个问题是,每次我向项目添加另一个文件时,Visual Studio 决定重新生成每个 .designer.cs 文件包含以及添加新文件包含。添加文件后看起来像这样:

<ItemGroup>
  <Compile Include="a_bunch_of_these.designer.cs" />
  <Compile Include="a_bunch_of_these.designer.cs" />
  <Compile Include="a_bunch_of_these.designer.cs" />
  ...

  <Compile Include="Business\WebForm1.aspx.designer.cs">
    <DependentUpon>WebForm1.aspx</DependentUpon>
  </Compile>

  <Compile Include="**\*.cs" Exclude="**\*.as?x.*"></Compile>

  <Compile Include="**\*.aspx.cs">
    <SubType>ASPXCodeBehind</SubType>
  </Compile>
  <Compile Include="**\*.ascx.cs">
    <SubType>ASPXCodeBehind</SubType>
  </Compile>
  <Compile Include="**\*.aspx.designer.cs"></Compile>
  <Compile Include="**\*.ascx.designer.cs"></Compile>
</ItemGroup>

到项目。我遇到的第二个问题不太重要,但仍然有点烦人。我在 ItemGroup 元素下的 Item 元素中没有 dependantupon 属性,因此在解决方案资源管理器中文件没有耦合在一起: See WebForm1 vs WebForm2

我有两个问题:

  1. 如何阻止 Visual Studio 添加这些新行?由于它被包含在项目中两次,因此它在解决方案资源管理器中出现两次,这非常烦人。

  2. 在使用通配符选择文件时,如何将 DependentUpon 元素与每个文件相关联?有没有办法从所选文件中挖掘名称以自动相对关联一个aspx文件?类似于:


<ItemGroup>
<Compile Include="**\*.aspx.cs">
  <SubType>ASPXCodeBehind</SubType>
  <DependentUpon>%(Filename)%(Extension)</DependentUpon>
</Compile>
</ItemGroup>

编辑: 这样你们就可以大致了解我正在尝试做的事情:我的项目是将网站自动部署到服务器上。我决定使用 Team City 来完成 CI。它克隆它所连接的存储库,然后构建项目。这段代码使得构建完成后,项目将自动复制到具有正确结构的正确文件夹中。

我也试过 ftp从 msbuild 社区任务上传,但是项目很大,ftp 花费的时间太多了。

我看过的另一件事是 WebDeploy,但由于找不到 Visual Studio 2015 年 Web Deploy 项目的文档,我决定尝试其他方法。

下面是我发现的问题的解决方案:

<Target Name="AfterRebuild">
  <ItemGroup>
    <cpyContent Include="**\*.*"></cpyContent>
  </ItemGroup>
  <Copy SourceFiles="@(cpyContent)" DestinationFolder="\wwwroot\%(cpyContent.RecursiveDir)" Retries="2" SkipUnchangedFiles="true" />
</Target>

由于 ItemGroup 位于 Target 元素中,因此 VS 似乎未将其包含在 GUI 中。这让 Visual Studio 可以在 GUI 中包含文件,但仍然让我拥有用于​​复制的正确元数据。

我有第二个问题的答案。 This question,这是我自己提问然后回答的,与您需要的非常相似。 你可以试试这个:

<ItemGroup>
  <AnyNameYouLike Include="**\*.aspx.cs"/>
  <Content Include="@(AnyNameYouLike)">
      <DependentUpon>$([System.String]::Join([System.String]::Copy('%(FileName)'),'.aspx')</DependentUpon>
  </Content>
</ItemGroup>

编辑

关键字“content”实际上将此文件类型标记为通常不正确的内容。相反,如果它是 c# 代码文件,则应将其替换为“编译”。此外,由于默认情况下所有未在 .csproj 文件中声明的 .cs 文件都标记为编译,使用 include 会导致双重包含错误,因此应该更新。

我更好的版本是这样的:

<ItemGroup>
  <Compile Update="**\*.aspx.cs"
      <DependentUpon>$([System.String]::Join([System.String]::Copy('%(FileName)'),'.aspx')</DependentUpon>
  </Compile>
</ItemGroup>