我们有一个大型 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", "....\ Release 1 \LibKernel\LibKernel\LibKernel.csproj", "{439B....}"

    进入

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

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

    多谢

    最佳答案

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

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

    假设文件名是 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 -->
    

    请注意上面文本中的以下行
    <Import Project="..\build\buildpath.xml" Condition="Exists('..\build\buildpath.xml')" />
    用法:

    在您将导入上述文件的 .csproj 或 .sln 文件中,您可以编写以下宏来替换该值。请注意标签名称与编写的宏匹配,即 $(AssemblyDirLocation)
    <ItemGroup>
        <Reference Include="Site.Kernel">
          <HintPath>$(AssemblyDirLocation)\bin\Site.Kernel.dll</HintPath>
          <Private>False</Private>
        </Reference>
    </ItemGroup>
    

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

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

    关于c# - Visual Studio 解决方案中的条件项目路径变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26420766/

    10-13 06:00