以这种方式结构化了 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
。
我做错了吗? 有没有办法避免手动编辑?
答案 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>
所以请回到您的原始帖子:
我做错了吗?有没有办法避免手动编辑?
您所做的一切都是针对您的具体情况的,没有错。有一些方法可以避免手动编辑,但是我不确定该方法是否满足您的需求。因为有时当我们想要避免一些手动编辑时,我们需要做更多的工作才能实现该方法。希望以上所有对您有所帮助:)