在Subversion中构造Visual Studio解决方案并保留项目引用

时间:2019-06-04 16:29:51

标签: visual-studio svn msbuild tags projects-and-solutions

以这种方式结构化 Visual Studio解决方案(在看到这样的问题15621之后):

sln/
    dll/
        trunk/dll.vbproj        
    exe/
        trunk/exe.vbproj

在这里,exe.vbproj 引用了 dll.vbproj。如果我使用 MSBuild 构建每个项目,一切都会很好。

现在我要标记dll和exe项目:

sln/
    dll/
        tags/1.0.0/dll.vbproj
        trunk/dll.vbproj       
    exe/
        tags/1.0.0/exe.vbproj
        trunk/exe.vbproj

我增加了一个目录的深度。因此,除非我手动将对exe/tags/1.0.0/exe.vbproj路径的引用固定,否则无法构建dll/tags/1.0.0/dll.vbproj

我做错了吗? 有没有办法避免手动编辑?

1 个答案:

答案 0 :(得分:1)

通常,当我们通过右键单击项目添加项目引用在一个exe项目中添加对dll的项目引用时,exe.xxproj中的修改应类似于:

  <ItemGroup>
    <ProjectReference Include="..\..\DllName\trunk\DllName.vbproj">
      <Project>{1fe037b8-5561-4aa0-895d-8bad9eadad20}</Project>
      <Name>DllName</Name>
    </ProjectReference>
  </ItemGroup>

因此,我认为您可以尝试将其更改为下面的内容,在加载项目文件时,如果项目位于主干文件夹中,则会将ref添加到主干文件夹下的.dll中。当.exe进入标签文件夹时,它将搜索标签文件夹以添加引用。

  <!--When in a trunk folder-->
  <ItemGroup Condition="'$(ProjectDir)'=='$(SolutionDir)$(AssemblyName)\trunk\'">
    <ProjectReference Include="..\..\dll\trunk\dll.vbproj">
      <Project>{1fe037b8-5561-4aa0-895d-8bad9eadad20}</Project>
      <Name>dll</Name>
    </ProjectReference>
  </ItemGroup>

  <!--Not in a trunk folder-->
  <ItemGroup Condition="'$(ProjectDir)'!='$(SolutionDir)$(AssemblyName)\trunk\'">
    <ProjectReference Include="$(SolutionDir)dll\tags\$(VersionNumber)\dll.vbproj">
      <Project>{1fe037b8-5561-4aa0-895d-8bad9eadad20}</Project>
      <Name>dll</Name>
    </ProjectReference>
  </ItemGroup>

对于此脚本,当它位于标签文件夹中时。我们使用路径:$(SolutionDir)dll\tags\$(VersionNumber)\dll.vbproj进行搜索。但是我们不知道$(VersionNumber)的值。($(SolutionDir)$(ProjectDir)是预定义的)

所以它的值取决于:

1。如果每次都有项目的更新版本,则将删除或移动较旧的版本。

我的意思是对于文件版本1.0.0.0,标签fodler下有一个1.0.0.0文件夹,当您将其更新为2.0.0.0时,仅存在一个2.0.0.0文件夹,而不是1.0.0.0和2.0.0.0文件夹在标签文件夹下。对于这种情况:路径可能类似于:$(SolutionDir)dll\tags\$(VersionNumber)\dll.vbproj

2。如果已在.xxproj文件中预定义了$(VersionNumber)属性,则路径可以是:$(SolutionDir)dll\tags\$(VersionNumber)\dll.vbproj

(不确定如何构造它们,如果通过.xxproj文件构造它们,则可能具有预定义的VersionNumber,如果您手动进行并且未在.vbproj中定义它,我们将无法轻松地使用路径这样)

3。现在,我们需要做的就是在构建过程中获取AssemblyFileVersion属性的值。根据您的情况,您需要在构建之前获取AssemblyFileVersion编号,请查看this thread中的“ First Direction”以获取更多详细信息。

对于格式:如果按文件版本进行结构化,请从<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>更改为<Pattern>\[assembly: AssemblyFileVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>

$(VersionNumber)应该类似于:

<PropertyGroup>
    <VersionNumber>$(FirstNum).$(SecondNum).$(ThirdNum).$(FourthNum)</VersionNumber>
</PropertyGroup>

所以请回到您的原始帖子:

  

我做错了吗?有没有办法避免手动编辑?

您所做的一切都是针对您的具体情况的,没有错。有一些方法可以避免手动编辑,但是我不确定该方法是否满足您的需求。因为有时当我们想要避免一些手动编辑时,我们需要做更多的工作才能实现该方法。希望以上所有对您有所帮助:)