2015-01-22 2 views
0

У меня есть файл структура, как следующие:Как программно обновить ссылки на проекты в Visual Studio проекте

- binaries 
    - binary1.dll 
- dev 
    - <developer-name> 
     - a.csproj 
-trunk 
    - a.csproj 

разработчики, которые должны работать на a.csproj создаст филиал в разработчике, и они будут работать с там. Наши проекты должны иметь ссылку на файл binary1.dll в каталоге двоичных файлов.

Если ссылка является относительным путем (по умолчанию для Visual Studio), то путь не будет работать как для проекта в магистрали, так и для проекта в ветке разработчика.

Чтобы обойти эту проблему, я думал о создании переменной среды и использования, что в файле проекта вместо:

<Reference Include="binary1"> 
    <HintPath>$(MY_ENV_VAR)\binary1.dll</HintPath> 
</Reference> 

Это прекрасно работает, но я хотел, чтобы помочь разработчикам добавлять ссылки легко, так что я написал программа, которая будет преобразовывать относительные пути, указывающие на binary1.dll (например, из ветви dev a.csproj это изменит путь ../../binaries/binary1.dll до $(MY_ENV_VAR)\binary1.dll), но я не понял, как это сделать.

Если я использую событие предварительной сборки, проект уже загружен в память, и событие возвращает ошибку, поскольку оно не может записать файл проекта.

Тогда я понял, что я мог бы переопределить цели MSBuild, и пытался с целями: BeforeCompiler, AfterCompiler, BeforeBuild, AfterBuild и во всех из них проект уже заблокирован.

Затем я столкнулся с this answer, и я модифицировал свой код для вызова исполняемого файла в цель GenerateApplicationManifest, но этот, похоже, вообще не вызывает исполняемый файл.

Некоторые другие идеи, с которыми я играл, создают новый проект, который обновляет второй проект и имеет связь между ними, но это дублирует количество проектов.

Я мог бы просто изменить глубину ствола, но это только скрывает проблему и на самом деле ее не решает. Когда разработчики создают ветку внутри своей ветви dev для работы с различными функциями или ошибками, у меня снова возникает одна и та же проблема.

Возможно, еще одна особенность, которая исправляет это более элегантным способом, но я ничего не смог найти.

Итак, мой вопрос: как мне получить MS Build или предварительную сборку событий для изменения проекта CS?

+0

для DLL вы просто должны установить ссылочный путь в проекте и изменить его в другую папку, чтобы автоматически использовать другую версию той же самой DLL – Franck

+0

почему бы не скопировать DLL с вами, когда вы вступаете? – DLeh

+0

@DLeh, потому что в конечном итоге я получаю десятки копий своих DLL и обновление библиотеки до новой версии будет означать прохождение всех файлов на сервере SCC и убедитесь, что я их все изменил. – Magus

ответ

0

Я нашел способ сделать это. Проблема заключалась в том, что сам процесс Visual Studio блокировал проект, но Visual Studio могла перезаписать файл. Я в конечном итоге изменения a.csproj включать:

<Target Name="BeforeBuild"> 
    <Exec Command="UpdateReferences.exe" /> <!-- This creates the $(ProjectPath).new file --> 
    <Move SourceFiles="$(ProjectPath).new" DestinationFiles="$(ProjectPath)" /> 
    </Target> 
+0

Хорошее обходное решение ......... – granadaCoder

Смежные вопросы