c# - argumentos - msbuild project
.csproj rutas de sugerencia mĂșltiples para un ensamblado (6)
Estoy empaquetando código de ejemplo para una distribución de SDK. En la distribución, la ruta relativa desde el código hasta los ensamblados del SDK es diferente de la máquina de compilación. Por ejemplo:
Distribución
csharp/bin/assembly.dll
example/ex1/ex1.csproj
Construir la máquina
foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj
Supongamos que no puedo mover nada. ¿Hay alguna manera de que pueda instruir a ex1.csproj
para que mire en ambos
../../csharp/bin/
y ../../../../foo/sdk/csharp/bin/
for assembly.dll
?
En C ++ colocaría la ruta de dependencia en una hoja de propiedades independiente y distribuiría una versión diferente con el SDK. Pero C # no tiene hojas de propiedades, y no quiero mantener dos versiones del proyecto completo.
He visto esta pregunta que dice que no puedo usar varias etiquetas <HintPath>
, así que estoy buscando otra forma de aproximarme al mismo comportamiento.
Agregue la ruta secundaria de la siguiente manera al grupo de propiedades general. en el archivo csproj
<PropertyGroup>
<ReferencePath>../../../../../foo/sdk/csharp/bin/</ReferencePath>
...
</PropertyGroup>
La propiedad ReferencePath
está destinada a ser especificada al ejecutar MsBuild, pero funcionará bien así.
Encontré una solución hacky que funciona para mi caso, donde se garantiza que el directorio principal será diferente en algún lugar del árbol:
<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>
Estoy usando esta solución sin ningún problema:
<Reference Include="log4net">
<HintPath>
$(SolutionDir)packages/log4net.2.0.8/lib/net45-full/log4net.dll
</HintPath>
</Reference>
Entendido desde aquí: use pistas de respuesta relativa de LeonidVasilyev
La manera más sencilla, ya que solo se puede utilizar ONE HintPath, es utilizar el atributo de Condición todo-así, así:
<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>
Entonces la respuesta a la pregunta sería esta:
<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>
Si coinciden varias condiciones, se usará la última.
Puede /csharp/bin
carpeta /csharp/bin
en una unidad (de manera diferente en cada máquina), por ejemplo X:
y luego hacer referencia a X:/
o X:/bin
en ambas máquinas, ya que la ruta será la misma.
Simplemente agregue la ubicación del servidor de compilación de los archivos DLL como ruta de referencia en el proyecto. Parece hacer el truco muy bien y es muy simple. Funciona solo si conoce la carpeta del servidor de compilación de las DLL.