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

Structure a Visual Studio solution in Subversion and preserve project references

结构一个Visual Studio解决方案这样(在看到SO问题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

我又加了一层目录。因此,除非我手动修复对 dll/tags/1.0.0/dll.vbproj 路径的引用,否则我将无法构建 exe/tags/1.0.0/exe.vbproj

我是不是做错了什么? 有没有办法避免手动编辑?

通常我们在一个exe工程中通过right-clicking project add project reference添加工程引用到dll时,exe.xxproj中的修改应该是这样的:

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

所以我觉得你可以试试改成下面的内容,在加载工程文件的时候,如果工程在trunk文件夹下,会把ref添加到trunk文件夹下的.dll中。当 .exe 在 tags 文件夹中时,它会搜索 tags 文件夹以添加 ref.

  <!--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 来执行 searching.But $(VersionNumber) 的值对我们来说是未知的。($(SolutionDir)$(ProjectDir) 是预定义的)

所以它的值取决于:

1.If 每当您有项目的更新版本时,您将删除或移动旧版本。

我的意思是对于文件版本1.0.0.0,在fodler标签下有一个1.0.0.0文件夹,当你更新到2.0.0.0时,只有一个2.0.0.0文件夹,而不是同时存在1.0.0.0和2.0。 tags 文件夹下的 0.0 文件夹。对于这种情况:路径可以是这样的:$(SolutionDir)dll\tags$(VersionNumber)\dll.vbproj

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

(不知道你是怎么构造它们的,如果你用.xxproj文件构造它们,你可能有预定义的VersionNumber,如果你手动做而不在.vbproj中定义它,我们不能轻易使用这样的路径)

3.Now 我们需要做的就是在构建过程中获取 AssemblyFileVersion 属性 的值。对于您的情况,您需要在构建之前获取 AssemblyFileVersion 编号,请查看 中的 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>

所以回到你原来的 post:

Did I do something wrong? Is there no way to avoid manually editing?

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