.csproj несколько путей подсказок для сборки
Я упаковываю пример кода для дистрибутива SDK. В дистрибутиве относительный путь от кода к сборкам SDK отличается от машины сборки. Например:
распределение
csharp/bin/assembly.dll
example/ex1/ex1.csproj
Сборка машины
foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj
Предположим, что я не могу ничего подвинуть. Есть ли способ, которым я могу наставить ex1.csproj
смотреть в обоих
../../csharp/bin/
а также ../../../../foo/sdk/csharp/bin/
за assembly.dll
?
В C++ я бы поместил путь зависимости в автономный список свойств и распространил другую версию с SDK. Но в C# нет списков свойств, и я не хочу поддерживать две версии полного проекта.
Я видел этот вопрос, который утверждает, что я не могу использовать несколько <HintPath>
теги, поэтому я ищу другой способ приблизиться к тому же поведению.
6 ответов
Я нашел хакерское решение, которое работает для моего случая, где родительский каталог гарантированно будет отличаться где-то вверх по дереву:
<Choose>
<When Condition="Exists('$(MSBuildProjectDirectory)\..\..\example')">
<ItemGroup>
<Reference Include="Assembly ...">
<HintPath>..\..\csharp\bin\assembly.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Assembly ...">
<HintPath>..\..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>
Самый простой способ, поскольку можно использовать только ОДИН HintPath, это использовать атрибут "все так хорошо", как этот:
<Reference Include="TheAssembly">
<HintPath Condition="Exists('..\My\Assembly\Path')">..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\My\Assembly\Path')">..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\My\Assembly\Path')">..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\..\My\Assembly\Path')">..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
etc...
</Reference>
Таким образом, ответ на вопрос будет следующим:
<Reference Include="assembly">
<HintPath Condition="Exists('..\..\csharp\bin')">..\..\csharp\bin\assembly.dll</HintPath>
<HintPath Condition="Exists('..\..\..\..\foo\sdk\csharp\bin')">..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
</Reference>
Если несколько условий совпадают, будет использовано последнее.
Я использую это решение без каких-либо проблем:
<Reference Include="log4net">
<HintPath>
$(SolutionDir)packages\log4net.2.0.8\lib\net45-full\log4net.dll
</HintPath>
</Reference>
Понял отсюда: используйте подсказки путей относительного ответа от Леонида Васильева
Добавьте дополнительный путь следующим образом к группе общих свойств. в файле csproj
<PropertyGroup>
<ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath>
...
</PropertyGroup>
ReferencePath
Свойство предназначено для указания при выполнении MsBuild, но оно будет нормально работать следующим образом.
Вы могли бы подставить /csharp/bin
папка в дисковод (по-разному на каждой машине), например X:
а затем ссылка X:\
или же X:\bin
на обеих машинах, поскольку путь теперь будет одинаковым.
Просто добавьте расположение сервера сборки DLL-файлов как путь ссылки на проект. Кажется, делать хорошо, и очень просто. Работает только в том случае, если вы знаете папку DLL-библиотеки на сервере сборки.