Как включить файл (#include ‹›), используя переменный путь в DXL (IBM DOORS)?

По сути, я запускаю DXL из пакетного файла. Этот пакетный файл, который получает некоторые пути из кода Java, отправляет пути в DXL.

Я получаю ОК пути в DXL (на самом деле это обычная строка), и теперь я хочу использовать эту строку пути, чтобы сделать некоторые #include.

Итак, если у меня есть переменная:

string a = "MY/PATH/IS/OK"

Я хочу использовать этот a для включения:

#include <a/whatever.inc>

Кто-нибудь знает, как?

Кроме того... Включения, которые я хочу сделать, находятся в той же папке, что и скрипт DXL, который должен делать то, что указано выше... могу ли я использовать что-то вроде:

#include <.\the_include_file.inc>

Или что-то вроде этого?


person JON LEGARDA    schedule 16.05.2019    source источник


Ответы (1)


В DXL команда #include оценивается до того, как оценивается любая другая команда DXL (по сути, препроцессор берет только содержимое файла, на который указывает ссылка, и заменяет строку, содержащую #include, содержимым скрипта. Таким образом, такой фрагмент, как

string a = ..read_some_value_from_a_file..
#include <{a}/whatever.inc>

не будет работать (ну, только внутри оператора eval_, но это слишком сложно)

Я думаю, что самый простой способ решить вашу проблему — это вызвать код Java перед запуском DOORS, а затем вызвать Doors.exe с параметром -addins, см. https://www-01.ibm.com/support/docview.wss?uid=swg21324525 и https://www-01.ibm.com/support/docview.wss?uid=swg21421641 для деталей и альтернатив. Кроме того, ознакомьтесь с кратким изложением Луи Ландейла по адресу https://www.ibm.com/developerworks/community/forums/html/topic?id=d43c725f-bd74-4c1a-88d5-51fdf8eed0b9, где также упоминаются переменные среды, которые вы можете использовать.

Обновление: некоторое время назад мы протестировали порядок поиска файлов dxl, вот фрагмент скрипта.

    string sCur                 = currentDirectory()             ; buf += sCur             ; buf += ";"
    string sInst                = (getenv "DOORSHOME") "\\lib\\dxl"; buf += sInst            ; buf += ";"
    string sAddinsCmd           = (getenv "DOORSADDINS")         ; buf += sAddinsCmd       ; buf += ";"        
    string sAddins              = (getenv "ADDINS")              ; if (null sAddinsCmd) buf += sAddins; buf += ";"

    string sProjectAddinsCmd    = (getenv "DOORSPROJECTADDINS")  ; buf += sProjectAddinsCmd; buf += ";"
    string sProjectAddins       = (getenv "PROJECTADDINS")       ; if (null sProjectAddinsCmd) buf += sProjectAddins   ; buf += ";"

Итак, если вы запускаете DOORS с помощью команд

C:\> D:
D:\> cd \temp
D:\temp> "c:\Program Files\IBM\DOORS\9.6\bin\doors.exe" -addins E:\scripts

и у вас есть оператор включения с относительным путем, то есть #include <src/lib/hello.inc>, DOORS сначала пытается найти каталог src в D:\temp, затем в c:\Program Files\IBM...\lib\dxl, затем в E:\ скрипты.

Если ваш оператор include имеет абсолютный путь, то есть #include <c:/myscripts/lib/dxl/goodmorning.inc> или #include <\\\\myservername\\myshare\\dxllib\\helloibm.inc>, он будет искать именно в этих местах.

person Mike    schedule 16.05.2019
comment
Но @Mike, есть ли способ включить файлы, находящиеся в одной папке... Я имею в виду что-то вроде: #include ‹./whatever.inc› - person JON LEGARDA; 16.05.2019
comment
#include ‹whatever.inc› или #include ‹./whatever.inc› или #include ‹.\\whatever.inc› с . будучи одним из каталогов, упомянутых в обновлении моего ответа - person Mike; 16.05.2019
comment
еще один комментарий: DXL не имеет понятия базового пути скрипта, DXL ничего не знает о файлах, в которых находится код, кроме #include-Statements, и даже #include удален из препроцессора. В Perl вы можете сказать perl c:\allmyscripts\helloworld.pl, а внутри сценария Perl вы можете запросить каталог, в котором находится helloworld.pl (имя каталога $0), а затем нажать @INC, имя каталога $0. В DXL это невозможно. - person Mike; 16.05.2019