Ostatnio na warsztatach przytrafiła nam się sytuacja, że pewien deloy nie zależnie jak próbowaliśmy go odpalić nam po prostu nie działał. A robiliśmy wszystko przez dobre 20 minuty (klikanie po VSTS nie jest łatwe…) ;) A wszystko rozbiło się o jedna prostą opcje, którą można ustawić na pliku w projekcie w Visual Studio.

Mianowicie, dla każdego z plików możemy ustalić dwie opcje – Build Action i Copy to Output Directory. W zależności od typu pliku jaki tworzymy, te opcje są domyślnie ustawiane za nas. I przeważnie defaultowe ustawienia są dobre. Dodajemy nowy plik cs? Build Action jest na Compile i Copy to Output Directory na Do not copy. Web.config zaś ma opcję Content i Do not copy.

Co to robi?

Copy to Output Direcory kopiuje pliku do katalogu wynikowego do którego aplikacja jest kompilowana. W przypadku Console Application czy Library, jest to bin\Debug|Release etc. To znaczy, że nasz plik (w zależności od opcji wybranej) będzie lub nie będzie zawsze do tego katalogu kopiowany.

Build Action zaś wykona określoną akcję na pliki w trakcie budowania projektu. To może być załączenie pliku jako zasobu, kompilacja czy też pominięcie pliku. Ale także istnieje opcja potraktowania pliku jako zawartości (Content). Content – czyli weź plik i załącz go do projektu zgodnie z planem publikowania/deployowania aplikacji.

Dla aplikacji windowsowych, przeważnie Build Action - Content, nie ma znaczenia, do póki nie wykorzystujemy opcji publikowania aplikacji – a przez cały okres mojego programowania w .NET próbowałem to zrobić 2 razy. Za to, duże znaczenie ma Copy to Output Directory. Opcja inna niż Do not copy skopiuje plik do bin\Debug|Release.

Dla aplikacji webowch zaś Copy to Output Directory powoduje, że plik ląduje w katalogu bin – w którym są wszystkie DLLki, ale nie ma tam strony. Strona znajduje się w katalogu root (katalog projektu), tam też znajdują się wszystkie pliki, które nas interesują – takie jak js, css, cshtml etc. By te pliki były uwzględnione w trakcie publikowania/deployowania aplikacji webowej, potrzebne jest poprawne ustawienie Build Action - Content na pliku. Spowoduje to, załączenie plików jak artefaktów a nie jako wynik kompilacji (bin). W przeciwnym wypadku, nasz plik nigdy nie zostanie załączony do wersji która będzie deployowana.

Podsumowanie

U nas rozbiło się wszystko o plik Dockerfile, który miał zaznaczoną opcję Build Action - None, i Copy to Output Directory - Always. Czyli w katalogu bin, lądował on cały czas, ale nigdy tam gdzie chcieliśmy go mieć – czyli w root.

Warto więc znać różnicą pomiędzy tymi dwoma opcjami i co daje jedna i co daje druga.

2 KOMENTARZE

  1. Warto jeszcze dodać, że ustawienie jakiegoś pliku w projekcie na “Copy always” spowoduje, że projekt w którym będzie się znajdował się ten plik zawsze będzie rebuildowany – nawet jeśli w kodzie nic się nie zmieniło. Może mieć to znaczący wpływ na czas budowania solucji.

Comments are closed.