如何防止Visual Studio 2012扩展MSBuild 4通配符?

12

最近我将我们的构建平台从一个基于rake的古老平台(别问我,真的)迁移到了使用msbuild的平台。由于我们团队中很多成员不使用Visual Studio(还是别问了),他们习惯于将.cs文件放入项目文件夹中,然后通过魔力让其成为构建的一部分。

因此,这个项目的.csproj文件包含以下行:

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

直接使用msbuild编译时这个方法很好用。但是,当我在Visual Studio中打开项目时,它似乎会立即将通配符扩展为完整的文件列表,作为"有帮助的"操作:

<ItemGroup>
    <Compile Include="Controller.cs" />
    <Compile Include="MyClass.cs" />
    <Compile Include="MyClass2.cs" />
    <Compile Include="etc/etc/Something.cs" />
    <!-- and so forth -->
</ItemGroup>

虽然从技术上来说这仍然有效,但它也会引起困扰,因为它会去掉通配符的能力。

我尝试实现这个页面上展示的技术,但我无法使其在简单编译中工作。

有人之前遇到过这个问题吗?有没有任何解决方法?

编辑:为了澄清“无法使其工作”的含义,这是我所做的:

在Main.csproj中,我有这样一个设置:

<!-- References in here -->
</ItemGroup>

<Import Project="Imports.proj" />

<ItemGroup>
<!-- ProjectReferences down here -->

然后,我创建了Imports.proj文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Compile Include="**\*.cs" Exclude="obj" />
    </ItemGroup>
</Project>

我在Visual Studio中打开Main.csproj文件时,没有显示任何文件。可能是<Import>的代码行出了问题?

编辑2:有趣的是,它仍然可以通过Visual Studio进行构建,只是不会将文件显示为项目的一部分。


链接文章中展示的技巧应该可以很好地完成,导入一些.proj文件,在其中包含<Compile Include="**\*.cs" Exclude="obj" />。你具体尝试了什么?你确定你把导入放在了正确的位置吗? - stijn
@stijn,我刚刚更新了问题并描述了我的尝试。 - Mike Caron
根据您的“编辑2”:是的,我忘了提到那部分内容:这些文件不会在VS中显示,我也不知道如何解决。当然,这样就没有一个VS项目有任何用处了。但思考一下,我担心这就是如何处理项目的:在第一种情况下,VS为您“修复”通配符,否则它可能无法在解决方案资源管理器中显示文件。在第二种情况下,它不会改变任何东西,但不会显示任何文件。不确定是否有解决方案。如果没有,则最好的选择可能是使用一个小工具从模板生成项目文件并插入所有cs文件... - stijn
1个回答

16

我也遇到了完全相同的问题,甚至想问和你一模一样的问题(构建时.csproj文件出现非预期更改),只不过是在你之后两天而已,没有注意到你自己提问了:

虽然我不能解释为什么VS在每次构建项目时决定这样做,但我有一个解决方案供你尝试,它与我解决问题的方法完全相同:

<PropertyGroup>
    <IncludePattern>**\*.cs</IncludePattern>
    <ExcludePattern>obj</ExcludePattern>
</PropertyGroup>

<ItemGroup>
   <Compile Include="$(IncludePattern)" Exclude="$(ExcludePattern)" />
</ItemGroup>

VS保留属性不进行通配符扩展,不将通配符扩展为完整的文件列表


1
太棒了!你是最棒的!我希望我早点有机会回来实现这个! - Mike Caron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接