【问题标题】:Visual Studio keeps adding property to my csproj. Why?Visual Studio 不断向我的 csproj 添加属性。为什么?
【发布时间】:2012-07-09 05:03:47
【问题描述】:

我正在使用 Visual Studio 2012 RC 来处理我的 C# 解决方案。我的所有特定于配置的设置都存储在一个 .props 文件中,然后我的所有 .csproj 文件都包含该文件。

然而 VS 坚持把它放在 include 前面:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
   <IntermediateOutputPath>C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Debug\</IntermediateOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
   <IntermediateOutputPath>C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Release\</IntermediateOutputPath>
</PropertyGroup>

<Import Project="$(MSBuildProjectDirectory)\..\Common.props" />

为什么会这样?

仅供参考,我的常用文件如下所示:http://pastebin.com/Uued1XY0

【问题讨论】:

  • 简单的回答是微软从不认为你会做这样的csproj文件定制。有时您可能能够稍微自定义项目文件(运气好),但大多数时候您只是麻烦自己。

标签: .net visual-studio msbuild visual-studio-2012 csproj


【解决方案1】:

因此,如果需要,您可以覆盖这些设置。如果您之前进行了导入,则 Visual Studio 的属性将优先。在 MSBuild 中,最后一个定义获胜并被使用。这是一件好事。它会导致错误吗?还是只是不喜欢?

【讨论】:

  • 我不喜欢它,因为每次我重新加载项目时这些临时路径都会改变。非常烦人,因为版本控制总是对所有项目进行更改。
【解决方案2】:

您已在项目中指定 。属性文件将具有 BaseIntermediateOutputPath。如果您未指定任何值,它将从您的 Base 派生。

如果未指定路径,则从 BaseIntermediateOutputPath 派生的完整中间输出路径。例如,\obj\debug。如果此属性被覆盖,则设置 BaseIntermediateOutputPath 无效。

参考:http://msdn.microsoft.com/en-us/library/bb629394.aspx

【讨论】:

    【解决方案3】:

    当 MSBuild 的路径错误时,可以插入那些 IntermediateOutputPath。

    在我们的例子中,我们在输出文件夹的 SolutionDir 之后有额外的不必要的斜线。

    什么对我们不起作用(注意多余的斜线):

    <OutputPath>$(SolutionDir)\out\bin\</OutputPath>
    <IntermediateOutputPath>$(SolutionDir)\out\obj\</IntermediateOutputPath>
    

    什么起作用了:

    <OutputPath>$(SolutionDir)out\bin</OutputPath>
    <IntermediateOutputPath>$(SolutionDir)out\obj</IntermediateOutputPath>
    

    为了帮助解决您的特定情况,请尝试在工具->选项->项目和解决方案->构建和运行-> MSBuild 项目构建输出详细度下打开诊断 MSBuild 输出和日志记录。然后,搜索生成的文件夹(例如“Temp”)。

    使用通用的 proj/props/targets 文件是个好主意,但它确实需要与 Visual Studio 稍作斗争。

    【讨论】:

    • 故障排除步骤对我不起作用(Visual Studio 2013)。 VS 在加载时而不是在构建时修改项目文件,因此诊断构建输出没有帮助。
    【解决方案4】:

    如果在加载期间插入 XML,我怀疑它与 NuGet 相关(假设您使用的是 NuGet)。如果您使用 Directory.Build.props 文件,您可以获得在 .props 文件中设置的 BaseIntermediateOuputPath。阅读这篇 stackoverflow 文章,了解有关搜索顺序及其工作原理的一些重要信息。

    Autogenerated IntermediateOutputPath in the .csproj file

    在项目文件中设置 BaseIntermediateOutputPath 不会重定向 NuGet,因为它的值是在 MSBuild 包含设置 BaseIintermediateOutputPath 的 Sdk.props 之后设置的。这个问题有两种解决方案。设置 Base... 值后,使用 Directory.Build.props 或在项目中导入 SDK。这个方法我没试过 在 .csproj 文件中的适当位置。 )。

    这是一个自定义构建的链接,它引用了其中一些技术:

    https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多