【问题标题】:Conditional project path variables in VisualStudio solutionsVisualStudio 解决方案中的条件项目路径变量
【发布时间】:2014-12-12 18:51:54
【问题描述】:

我们有一个大型 C# 程序,分为 2 个主要组:内核库和(客户)特定应用程序和服务。

我们的 TFS 结构(简化)是这样的:

内核

  • DLVP
  • 发布 1
  • 第 2 版
  • 第 3 版
  • ...

客户A

  • DLVP
  • 发布

客户B

  • DLVP
  • 发布

我们使用 nugets 来编译和分发我们的内核代码,并将其包含到客户应用程序中。所以我们可以很容易地转移到一个新的版本/发行版。然而,我们并不满足于只有 dll。我们希望在任何地方都能获得完整的调试和编辑体验。

您可以在客户解决方案中包含内核项目,但它们会引用 Release X,因此如果我们想要迁移到新版本,我们必须为每个客户更改每个解决方案和项目文件,这是一个很多(N 个客户 x M 服务/程序 = 很多)

我读到您可以使用环境变量来更改 .sln 和 .csproj 文件中的某些值,但我们希望有一些对所有开发人员来说更可控的东西。我更喜欢引用一个也可以存储在 TFS 中的共享变量。

我制作了一个小的 .sln 文件来澄清一下:

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{B6B9AE41-99ED-47CE-B35C-F693C5F5F736}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibKernel", "..\..\Release 1\LibKernel\LibKernel\LibKernel.csproj", "{439BD82B-340D-4D69-B367-E52E0DF27983}"
EndProject

我想改变这部分:

"LibKernel", "....\ 第 1 版 \LibKernel\LibKernel\LibKernel.csproj", "{439B....}"

进入

"LibKernel", "....\ {CustomerA.CurrentRelease} \LibKernel\LibKernel\LibKernel.csproj", "{439B....}"

类似的东西(也适用于 .csproj 文件),但如果它们是更好的方法,我很高兴听到它们。

非常感谢

【问题讨论】:

    标签: c# visual-studio versioning solution csproj


    【解决方案1】:

    我们使用这种想法来根据用户需要引用位于特定位置的程序集。

    首先您需要保存一个外部文件,其内容如下所示..

    假设文件名是buildpath.xml

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
        <PropertyGroup>
            <AssemblyDirLocation>C:\inetpub\wwwroot\SiteInstance\Website</AssemblyDirLocation>
        </PropertyGroup>
    </Project>
    

    接下来我们在 .csproj 中导入这个配置。我相信它也适用于 .sln 文件

    为了正确理解,我在 .csproj 文件中包含了一些周围的文本

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
      <Import Project="..\build\buildpath.xml" Condition="Exists('..\build\buildpath.xml')" />
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <!-- more text -->
    

    请注意上面文本中的以下行

    &lt;Import Project="..\build\buildpath.xml" Condition="Exists('..\build\buildpath.xml')" /&gt;

    用法:

    .csproj.sln 文件中,您将在其中导入上述文件,您可以编写下面的宏来替换该值。请注意标签名称与编写的宏匹配,即$(AssemblyDirLocation)

    <ItemGroup>
        <Reference Include="Site.Kernel">
          <HintPath>$(AssemblyDirLocation)\bin\Site.Kernel.dll</HintPath>
          <Private>False</Private>
        </Reference>
    </ItemGroup>
    

    每当您在 buildpath.xml 外部文件中进行更改时,您都需要重新加载引用项目。

    我希望这很清楚并且会有所帮助。

    【讨论】:

    • 是的,我想我明白了。我会尝试一下。但是,我有点怀疑这是否也适用于 .sln 文件,因为与 .csproj 的 xml 文件相比,.sln 文件是一种简单(可配置性较低?)文本格式......我会发布后来的结果,thx
    • 它适用于项目文件 (.csproj) 但不适用于 .sln 文件。我不认为它可以解析 $(AssemblyDirLocation): --- ...\TestVersioning\$(AssemblyDirLocation)\LibKernel\LibKernel\LibKernel.csproj:错误:无法读取项目文件 'LibKernel.csproj'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多