MSBuild чистая строка каталога - PullRequest
2 голосов
/ 06 августа 2010

У меня есть свойство в MSBuild для представления каталога над MSBuildProjectDirectory:

<PropertyGroup>
    <BuildDir>$(MSBuildProjectDirectory)\..</PRSBuildDir>
</PropertyGroup>

Мне нужно использовать это свойство, но мне нужно очистить строку каталога, чтобы она не включала ...Другими словами, мне нужно оценить .., поэтому, если текущий файл проекта находится в C:\Test\Tom\MyDir, мне нужно свойство, содержащее строку C:\Test\Tom.

. Я спрашиваю, потому чтоЯ пытаюсь выполнить команду, подобную этой:

msiexec /passive /i "D:\Build\2.3.84.40394\Deployment\..\Vendor\LogParser.msi"

Но он жалуется на путь к msi: This installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.

Ответы [ 4 ]

2 голосов
/ 09 августа 2010

Существует задача ConvertToAbsolutePath , что может быть использовано?

1 голос
/ 11 августа 2010

(удалил мой ответ, так как я не увидел, что Том ответил точно так же!)

Кстати, почему бы вам не установить атрибут «WorkingDirectory» задачи Exec, гдевы фактически называете msiexec местоположением MSI - таким образом, вы не столкнетесь с проблемами длины пути

1 голос
/ 07 августа 2010

Если вы хотите, чтобы подстановочный знак оценивался , вам следует использовать Item вместо Property.

<ItemGroup>
  <BuildDir Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>

<Target Name="ExecMSIExec">
  <Exec Command="msiexec /passive /i %(BuildDir.FullPath)\Vendor\LogParser.msi"/>
</Target>
1 голос
/ 06 августа 2010

Лучший метод, который у меня сейчас есть, ниже, но мне было интересно, может ли быть лучший способ ...

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <BuildDir>$(MSBuildProjectDirectory)\..</BuildDir>
    </PropertyGroup>

    <Target Name="Test">
        <ItemGroup>
            <CleanBuildDir Include="$(BuildDir)" />
        </ItemGroup>

        <PropertyGroup>
            <BuildDir>%(CleanBuildDir.FullPath)</BuildDir>
        </PropertyGroup>

        <Message Text="$(BuildDir)" />
    </Target>
</Project>
...