我们有一个大型 C# 程序,它分为 2 个主要组: 内核 库和(客户) 特定的 应用程序和服务。
我们的TFS结构(简化)是这样的:
核心
客户A
客户B
我们使用 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/