Modelica中的绝对和相对路径冲突
Absolute and relative path conflict in Modelica
我想建立一个测试库并将其与正在开发的库分开。我的第一个想法是采用如下结构:
PensLib
--Variants
----BallPoint
----FountainPen
----Tests
------TB_BallPoint
HammocksLib
--Variants
----SingleHammock
----DoubleHammock
----Tests
------TB_DoubleHammock
--Systems
----IndoorWalls
----OutdoorWallAndTree
----CoconutPalms
----Tests
------TB_IndoorWalls
Tests
--PensLib
----Variants
------Test_BallPoint // extends PensLib.Variants.Tests.TB_BallPoint
--HammocksLib
----Variants
------Test_DoubleHammock // extends HammocksLib.Variants.Tests.TB_DoubleHammock
----Systems
------Test_IndoorWalls // extends HammocksLib.Systems.Tests.TB_IndoorWalls
现在让我们假设我构建我的库的方式是有意义的(很可能没有)。我将很快就在 Dymola 和测试库中设置测试环境的良好实践提出更多问题。
我的问题是关于在模型中处理相对和绝对路径的正确方法,如果可能的话。
- 模型
PensLib.Variants.Tests.TB_BallPoint
用于开发变体BallPoint
- 模型
Tests.PensLib.Variants.Tests_BallPoint
用于自动化测试
我希望模型 Test_BallPoint
扩展模型 TB_BallPoint
,但我不能 link 它们。我想绝对路径 PensLib.Variants.Tests.TB_BallPoint
被视为相对路径,因为 PensLib
是在测试库的“出路”中找到的,并且从那里它会寻找路径的其余部分。有没有办法控制路径,有点像 ..\..\..\PensLib\Variants\Tests\TB_BallPoint
?
正如您已经注意到的那样,这样的设置会带来麻烦。有一些解决方法,即 global name lookup 和 imports,我将在下面进一步简要解释。
当您在某些情况下遇到这种情况时,这两种解决方案都很好。但是如果你必须一直使用它,你的设置就会变得不必要的复杂。
因此,我建议让自己的生活更轻松并更改您的包结构:
- 要么为每个库创建一个专用的测试库,可能
PensLib_Tests
和HammocksLib_Tests
- 或者重命名
Tests
库中的包,不要使用确切的库名称
全局名称查找
您可以使用绝对 class 路径。它们用前导 .
表示,所以这应该有效:
extends .PensLib.Variants.Tests.TB_BallPoint;
参见 Modelica 规范第 5 章:Scoping, Name Lookup, and Flattening for details, especially 5.3.3 Global Name Lookup
正在导入
您只需导入库即可。导入查找始终在全局执行。
import PensLib;
extends PensLib.Variants.Tests.TB_BallPoint;
我想建立一个测试库并将其与正在开发的库分开。我的第一个想法是采用如下结构:
PensLib
--Variants
----BallPoint
----FountainPen
----Tests
------TB_BallPoint
HammocksLib
--Variants
----SingleHammock
----DoubleHammock
----Tests
------TB_DoubleHammock
--Systems
----IndoorWalls
----OutdoorWallAndTree
----CoconutPalms
----Tests
------TB_IndoorWalls
Tests
--PensLib
----Variants
------Test_BallPoint // extends PensLib.Variants.Tests.TB_BallPoint
--HammocksLib
----Variants
------Test_DoubleHammock // extends HammocksLib.Variants.Tests.TB_DoubleHammock
----Systems
------Test_IndoorWalls // extends HammocksLib.Systems.Tests.TB_IndoorWalls
现在让我们假设我构建我的库的方式是有意义的(很可能没有)。我将很快就在 Dymola 和测试库中设置测试环境的良好实践提出更多问题。
我的问题是关于在模型中处理相对和绝对路径的正确方法,如果可能的话。
- 模型
PensLib.Variants.Tests.TB_BallPoint
用于开发变体BallPoint - 模型
Tests.PensLib.Variants.Tests_BallPoint
用于自动化测试
我希望模型 Test_BallPoint
扩展模型 TB_BallPoint
,但我不能 link 它们。我想绝对路径 PensLib.Variants.Tests.TB_BallPoint
被视为相对路径,因为 PensLib
是在测试库的“出路”中找到的,并且从那里它会寻找路径的其余部分。有没有办法控制路径,有点像 ..\..\..\PensLib\Variants\Tests\TB_BallPoint
?
正如您已经注意到的那样,这样的设置会带来麻烦。有一些解决方法,即 global name lookup 和 imports,我将在下面进一步简要解释。
当您在某些情况下遇到这种情况时,这两种解决方案都很好。但是如果你必须一直使用它,你的设置就会变得不必要的复杂。
因此,我建议让自己的生活更轻松并更改您的包结构:
- 要么为每个库创建一个专用的测试库,可能
PensLib_Tests
和HammocksLib_Tests
- 或者重命名
Tests
库中的包,不要使用确切的库名称
全局名称查找
您可以使用绝对 class 路径。它们用前导 .
表示,所以这应该有效:
extends .PensLib.Variants.Tests.TB_BallPoint;
参见 Modelica 规范第 5 章:Scoping, Name Lookup, and Flattening for details, especially 5.3.3 Global Name Lookup
正在导入
您只需导入库即可。导入查找始终在全局执行。
import PensLib;
extends PensLib.Variants.Tests.TB_BallPoint;