2015-03-07 19 views
16

W moim projekcie używam zewnętrznego narzędzia do aktualizacji niektórych plików binarnych. Pliki te są zawarte w projekcie jako "treść".Visual Studio dodaje zdarzenie pre-build, które zawsze działa (projekt C#)

W tej chwili narzędzie jest uruchamiane podczas "zdarzenia poprzedzającego kompilację" we właściwościach projektu C#. Niestety to zdarzenie jest wykonywane tylko wtedy, gdy projekt jest nieaktualny, co nie jest tym, czego potrzebuję.

Pracuję nad tym, zawsze używając "przebuduj" zamiast "kompilacji" w moim projekcie, ale jest to nużące i powolne.

Muszę wykonać to narzędzie zawsze, niezależnie od tego, czy projekt jest, czy nie jest aktualny. W rzeczywistości nawet zanim MSBuild zdecyduje, czy projekt jest aktualny, narzędzie modyfikuje niektóre pliki zawarte w projekcie, wpływając tym samym na aktualny wynik kontroli.

Czy jest to właściwy sposób?

+1

Nie, modyfikowanie projektów podczas ich ładowania do IDE nie zakończy się pomyślnie. Na pewno jest lepszy sposób, twoje pytanie nie pomoże nam pomóc. –

+1

@HansPassant Może przesadziłem z tym pytaniem. Sprowadza się to do tego: czy istnieje sposób na wykonanie polecenia przed kompilacją? – kaalus

+1

Dla projektów C++ możesz to zrobić używając Celu z atrybutem 'BeforeTargets =" BuildGenerateSources "', dla C# możesz zrobić coś podobnego i po prostu wymyślić, który z wielu celów zostanie wywołany w kompilacji, której będziesz używał dla tego atrybutu BeforeTargets. Uruchom pełną kompilację i sprawdź wyjście lub zacznij szukać w Microsoft.CSharp.targets lub tak samo. Jednak, jak mówi Hans: wyniki mogą nie być zgodne z oczekiwaniami – stijn

Odpowiedz

31

Oto rozwiązanie. Zdefiniować tę właściwość w pliku projektu:

<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 

PreBuildStep następnie wykonać za każdym razem, niezależnie od tego, czy projekt jest lub nie jest aktualne.

Wygląda na to, że Visual Studio omija normalne i aktualne kontrole MSBuild i używa niestandardowego sprawdzenia, które jest szybsze, ale ma efekt uboczny zrywania niestandardowych celów kompilacji.

+13

Dokładniej musi to być ' true ' – M2X

+0

Dlaczego akceptowana odpowiedź nie jest pierwszą odpowiedzią na stronie? –

+0

to również uruchamia kompilację, nawet jeśli nie ma żadnych zmian – vip32

4

Na poziomie projektu, masz trzy opcje:

1) Pre-build cel działania

<PropertyGroup> 
    <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent> 
</PropertyGroup> 

2) normalny BeforeBuild

<Target Name="BeforeBuild"> 
    <Exec Command="notepad.exe Foo.txt" /> 
</Target> 

3) "przywiązany" do „Build "target (jak sugeruje stijn)

<Target Name="BeforeBuild2" BeforeTargets="Build"> 
    <Exec Command="notepad.exe Foo.txt" /> 
</Target> 

W rzeczywistości to rozwiązanie (w przypadku kompilacji) nie będzie działać, ponieważ DependsOnTargets jest wykonywane PRZED BeforeTargets. A dokładnie w DependsOnTargets prawdziwy (CoreBuild) siedzi :) Dlatego wymyślono cel „BeforeBuild”;)


W obu przypadkach VS sprawdzić, czy coś się zmiany (pliki są up-to- data). Dlaczego chcesz uruchomić zewnętrzny program, jeśli nic się nie zmieni? Jeśli ten program działa na plik (np. "Content"), msbuild i VS powinny wykrywać pliki jako nieaktualne i budować proces.


Niestety IDE (Visual Studio) ma własną metodę radzenia sobie z projektami msbuild. Główny mechanizm jest taki sam, ale kiedy dochodzi do ustalenia, jaki projekt zbudować, czy nie, lub w jakiej kolejności ... VS działają totalny inaczej.

Możesz użyć narzędzia zewnętrznego i uruchomić "msbuild" na swoim rozwiązaniu lub projekcie. To również skompiluje "właściwą drogę", a pliki binarne nie będą się różnić, ale będziesz miał pełne możliwości i potencjały MsBuild

+0

Muszę uruchomić program zewnętrzny, ponieważ przetwarza on bardzo dużą liczbę plików w pojedynczy plik binarny. Nie byłoby możliwe dodanie wszystkich tych plików do projektu Visual Studio, więc nie są one w projekcie. MSBuild nic o nich nie wie. Narzędzie zewnętrzne posiada własny, aktualny mechanizm sprawdzania, który sprawdza, czy te pliki wymagają przetwarzania, ale musi działać w pierwszej kolejności, a VS nie chce współpracować. Czy to zbyt dużo, aby zapytać ... – kaalus