Можно ли включить пакет условно? - PullRequest
1 голос
/ 20 июня 2019

Это будет легче объяснить, используя пример на C. Когда вы создаете приложение на C (или C ++ и т. Д.), Вы можете создать «релиз», который бы не включал в себя какой-то код, который был бы у вас без релиза.один.Пример: тестовый код и т. Д.

Я пытаюсь сделать подобное в TCL.У нас есть несколько функций трассировки, которые я бы хотел использовать в качестве «пустой оболочки» в «релизе».

Поэтому я подумал, что могу использовать два разных пакета для этого и использовать один в выпуске и один в конструкторе, чтобы дизайнер мог использовать"определение" или что-то подобное.

Я знаю, что я также мог бы "заменить" каждую функцию, используя "переименование" и "псевдоним", но мое приложение запускает много потоков (и есть один интерпретатор на поток), поэтому я быЯ думаю, мне нужно заменить несколько функций в нескольких потоках, и это усложнит ситуацию.Я подумал, что вместо использования двух разных пакетов можно было бы решить «один выстрел - решить все».

Спасибо

1 Ответ

1 голос
/ 21 июня 2019

Один из самых простых приемов - добавить немного магии в скрипт pkgIndex.tcl для пакета.Обычно это выглядит примерно так (cookiejar - это небольшой пакет, который я написал в 8.7):

package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar.tcl]]

Но если вы хотите сделать условия более условными, вы можете вместо этого сделать:

if {[info exist ::developermode]} { # Or however you want to detect it!
    package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar-dev.tcl]]
} else {
    package ifneeded cookiejar 0.1 [list source [file join $dir cookiejar-release.tcl]]
}

После этого вы можете иметь две реализации: одну для разработки и другую для выпуска;в вашем случае версия выпуска, вероятно, должна представлять собой просто пустое место в функциях, которые предоставляют тот же API, но ничего не делают.(Вы не можете предоставить какие-либо команды или сделать что-либо непоследовательным, но это может привести к сбою кода, работающего в процессе разработки, в prod.)


Если это поможет, учтите, что если вы определяетепроцедура, подобная этой:

proc someCommand {args} {}

(то есть, просто принимает args в качестве формального аргумента и имеет пустое тело.) тогда Tcl сделает эту процедуру полностью удаленной из байт-кода времени выполнения ваших процедур.которые используют это.Это, вероятно, будет очень полезно для вас;он позволяет вашему производственному коду ссылаться на ваших помощников по отладке, но при этом не требует (значительных) затрат на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...