在 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 有时当我们想要避免一些手动编辑时,我们需要做更多的工作才能实现该方法。希望以上对您有所帮助:)
结构一个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 编号,请查看
对于模式:如果您按文件版本构建它们,则从 <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 有时当我们想要避免一些手动编辑时,我们需要做更多的工作才能实现该方法。希望以上对您有所帮助:)