我们有一个大型C#程序,分为两大类:内核库和(客户)特定应用程序&服务。
我们的TFS结构(简化)是这样的:
内核
CustomerA
CustomerB
我们使用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文件),但如果它们是更好的方法,我很高兴听到它们。
很多
答案 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 外部文件中进行更改时,都需要重新加载引用项目。
我希望这很清楚并且会有所帮助。