добавить% PATH% многих листов свойств Visual Studio (.props) аддитивно - PullRequest
0 голосов
/ 11 марта 2020

Чтобы определить PATH локально в проекте из листа свойств, мне нужно добавить его в LocalDebuggerEnvironment.

Этот подход хорошо работает, когда есть только 1 лист свойств, который определяет PATH.

Если у меня более одного листа свойств, тогда я хочу использовать PATH из каждого листа свойств ,
Visual Studio будет рассматривать только PATH из включенного мной листа свойств последний .

Пример

Если я создаю лист свойств B1.props: -

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH1;%PATH%     
</LocalDebuggerEnvironment></PropertyGroup>

, лист свойств B2.props: -

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH2;%PATH%       <!-- different only this line -->
</LocalDebuggerEnvironment></PropertyGroup> 

, лист свойств C.props (= включают B1.props & B2.props): -

<ImportGroup Label="PropertySheets">
    <Import Project="B1.props" />
    <Import Project="B2.props" />
  </ImportGroup>

и установите для проекта Visual Studio значение C.props

, я получу результат: PATH=SOMEPATH2;%PATH%.

Вопрос

Как заставить Visual Studio использовать суммирование пути, например PATH=SOMEPATH2;SOMEPATH1;%PATH%
... при сохранении свойства nice лист модульность ?

1 Ответ

1 голос
/ 16 марта 2020

Так или иначе вам нужно будет наследовать значения свойств в каждом листе импортируемых свойств. Видите ли, если вы напишите <A>someValue</A>, тогда, чем бы ни было A, теперь оно будет установлено на someValue. Вам нужно <A>someValue;$(A)</A>, чтобы вычисленное значение состояло из "старого", объединенного с новым.

В этом случае вы не можете просто объединить переменные, хотя из-за выражения PATH =. Предположим, вы используете

<LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
<LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>

, тогда вы получите

PATH=SOMEPATH2;PATH=SOMEPATH

Так что вам нужен обходной путь. Одним из способов является использование отдельного значения для путей, которые вы хотите добавить:

B1:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

B2:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH2;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

C:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

Недостатком является то, что вам нужны 2 переменные и необходимо повторять часть LocalDebuggerEnvironment в каждом файле, иначе вы не сможете использовать их отдельно. Однако в остальном это довольно удобно и понятно. И если вы не хотите использовать B1 и B2 по отдельности, вам вообще не нужны LocalDebuggerEnvironment. Затем, если вам нужно только значение от B1, вы добавите C и B1 к своему проекту.

Единственная альтернатива, которую я вижу в настоящее время, будет означать, что вам придется выполнить некоторый анализ значения, чтобы получить наследование работает без повторения PATH = part. Но это не совсем красиво и, возможно, в некоторых случаях может сломаться. В общем, я бы советовал против этого, просто слишком сложно. Вот один вариант; используя свойства функций , примите текущее значение LocalDebuggerEnvironment, удалите часть PATH =, удалите часть% PATH%, затем удалите несколько последовательных точек с запятой (я думаю, это не обязательно). Как видите, C ничего не нужно, поскольку Bs уже позаботились о наследовании значения и поэтому могут использоваться автономно:

B1:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

B2:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

C:

<PropertyGroup Label="UserMacros" />
...