构建时.csproj文件中的不需要的更改

时间:2014-02-07 12:03:35

标签: visual-studio-2010 msbuild web-config web.config-transform itemgroup

我正在尝试自动检测web.configs作为我的一个Web应用程序项目文件中的转换预构建事件的一部分,此代码从我的项目文件上升到一个文件夹级别并获取所有web.configs每个目录和子目录:

<ItemGroup>
    <WebConfigsRelativePath Include ="..\**\Web.config"/>
</ItemGroup>

这很好用,但每次我构建并退出Visual Studio时,都会收到一个提示,询问我是否要保存对我的解决方案文件所做的更改。如果我选择是,并打开项目文件,则上面的代码将更改为每个web.config的位置

<ItemGroup>
    <WebConfigsRelativePath Include="..\Web\Decade\Web.config" />
    <WebConfigsRelativePath Include="..\Web\Matrix\RiskAnalysis\Web.config" />
    <WebConfigsRelativePath Include="..\Web\Service\Web.config" />
    <WebConfigsRelativePath Include="..\Web\Web.config" />
</ItemGroup>

这很好但是我自动检测web.configs预构建的全部原因是我可以随意添加和删除web.configs而无需硬编码他们的位置,每次我退出VS,位置将在项目文件中进行硬编码....

有没有人知道为什么每次退出Visual Studio时这个ItemGroup都会改变?

2 个答案:

答案 0 :(得分:1)

如果我使用现有的网络项目,但在示例中使用<Content />而不是自定义<WebConfigsRelativePath />,那么我会看到预期的行为。

尝试使用:

<Content Include="..\**\Web.config">
  <SubType>Designer</SubType>
</Content>

编辑:

如果您对WebConfigsRelativePath项目组有特殊处理,请将其发布到您的问题的更新中。

答案 1 :(得分:1)

虽然我无法解释为什么VS每次构建解决方案时都决定输出通配符检索的文件列表,但我可以告诉你我是如何解决这个问题的:

<PropertyGroup>
    <WebConfigsSearchString>..\**\Web.config</WebConfigsSearchString>
</PropertyGroup>

<ItemGroup>
    <WebConfigsRelativePath Include ="$(WebConfigsSearchString)"/>
</ItemGroup>

通过在属性中定义搜索字符串(始终保持静态)并引用项目组的要包含的文件列表中的属性,永远不会修改项目组代码,但每次执行web.config搜索时构建运行