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
我有两个问题:
如何阻止 Visual Studio 添加这些新行?由于它被包含在项目中两次,因此它在解决方案资源管理器中出现两次,这非常烦人。
在使用通配符选择文件时,如何将 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>
通过将这些行放入我的 .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
我有两个问题:
如何阻止 Visual Studio 添加这些新行?由于它被包含在项目中两次,因此它在解决方案资源管理器中出现两次,这非常烦人。
在使用通配符选择文件时,如何将 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>