fri*_*gle 1 tfs environment-variables csproj tfsbuild visual-studio-templates
我正在 Visual Studio 中整理一个模板项目供我的部门使用。项目需要引用一些存储在TFS其他地方的常用库。问题是模板可能会在各种位置使用,而我在尝试可靠地设置 HintPath 以处理所有位置时遇到了麻烦。
模板化项目需要能够在本地和 TFS 中找到公共库,以便在构建中使用。目前,在我们现有的应用程序中,引用如下所示:
<Reference Include="Company.Common">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
但是到达根节点需要遍历的父节点数量可能会有所不同。
与其为 ../、../../、../../../ 等设置 50 个条件路径,我的第一个想法是设置一个绝对引用。工作文件夹在我们的组织中是标准化的,因此在本地,始终可以在 C:\Projects\Core Components\...
但这不适用于服务器构建。所以我想我需要某种环境变量来解决 $/. 我正在想象这样的事情:
<Choose>
<When Condition="Exists('C:\Projects')">
<ItemGroup>
<Reference Include="Company.Common">
<HintPath>C:\Projects\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Company.Common">
<HintPath>$(TFSRoot)\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何实现这一点。
更新:
最终,我们确实建立了一个内部 Nuget 服务器。我建议任何有同样困境的人解决任何阻碍您设置 Nuget 的繁文缛节。我们用这种老套的做事方式生活了 3 年,总有一些新的问题需要人工干预。
我有两个关于如何解决这个问题的建议。好方法和更好的方法。
好方法(也是最常见的)是,如果您有一些共享库 X,并且您需要在应用程序 A、B 和 C 中使用它。在项目 A 下,您将有一个 lib 文件夹,您可以在其中签入 X 的副本.dll。项目 B 有自己的 lib 文件夹和自己的 X.dll 副本(不一定是 A 依赖的相同版本的 X)。等等。在这个模型中,A/B/C 的维护者可以选择何时引入新版本的 X 并更新他们的 lib 文件夹。
更好的方法是使用 NuGet(一个包管理器)。Project X 将每个新版本发布到某个地方的 NuGet 提要,A/B/C 将订阅该 NuGet 提要,Visual Studio/TFS Build 将根据需要自动下载 NuGet 包。这也提供了一些额外的灵活性,因为项目 A 可以说“我依赖 X ver 3.2”,也可以说“我依赖最新版本的 X”,而 NuGet 可以完成这项工作。