Visual Studio解决方案中的条件项目路径变量

时间:2014-10-17 08:18:18

标签: c# visual-studio versioning solution csproj

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

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

内核

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

CustomerA

  • DLVP
  • 发布

CustomerB

  • DLVP
  • 推出

我们使用nugets编译和分发我们的内核代码并将其包含在Customer应用程序中。因此,我们可以轻松地转移到新版本/发布。但是,我们不满足于只有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文件),但如果它们是更好的方法,我很高兴听到它们。

很多

1 个答案:

答案 0 :(得分: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 -->

请注意以上文字

的后续行

<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 外部文件中进行更改时,都需要重新加载引用项目。

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