Mam VS2008 Chcę skopiować określone pliki z katalogu do mojego /bin/
folderu. Ustawiłem pliki (znajdujące się w/common/browserhawk/
) na „Kopiuj do katalogu wyjściowego”. Jednak kopiuje również strukturę folderów: pliki są kopiowane do/bin/common/browserhawk/
Jak sprawić, by te pliki zostały skopiowane tylko /bin/
? Nie chcę przechowywać ich w katalogu głównym witryny, aby można je było poprawnie skopiować.
Powiązane pytanie: Visual Studio dodaje pliki .dll i .pdb do projektu po kompilacji
źródło
xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
Ponieważ nie mogę komentować wcześniejszych odpowiedzi, rozwiązanie umieszczę tutaj:
Dodając do tego, co dostarczył @PaulAlexander, dodaj do swojego pliku .csproj / .vbproj:
<ItemGroup> <AvailableItemName Include="RootContent"> <Visible>false</Visible> </AvailableItemName> </ItemGroup> <Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target>
Umożliwia to wybranie „RootContent” jako akcji kompilacji w oknie Właściwości, a dostęp do wszystkich można uzyskać za pośrednictwem interfejsu GUI. Bardziej szczegółowe wyjaśnienie: opcja „AvailableItemName” zasadniczo tworzy nową nazwaną listę, do której można przypisać elementy w projekcie we właściwości „Build Action” w oknie Properties. Możesz następnie użyć tej nowo utworzonej listy w dowolnym celu (np. Przez „@ (RootContent)”).
źródło
AvailableItemName
że jest nieprawidłowym elementem, jeśli edytujesz plik projektu w VS; po prostu zignoruj ostrzeżenie, i tak działa.<Target Name="RootOutputCopyTarget" AfterTargets="Build">
... </Target>Jeśli edytujesz plik .csproj / .vbproj w edytorze tekstu, możesz kontrolować, gdzie plik zostanie umieszczony w katalogu wyjściowym, a także jaką nazwę będzie miał plik w katalogu wyjściowym. Na przykład:
<None Include="content\someContent.txt"> <Link>someContentInOutputDirectory.txt</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None>
Spowoduje to umieszczenie pliku
content\someContent.txt
wbin\someContentInOutputDirectory.txt
. Możesz także wybrać podkatalog w,bin
jeśli chcesz; po prostu dodaj go do elementu Link.źródło
Uważam, że polecenie XCOPY lepiej obsługuje katalogi i pliki. W związku z tym,
Co pozwala na tworzenie folderów poza katalogiem docelowym.
Struktura folderów / plików projektu:
Staje się:
źródło
/D
może być również przydatne, aby uniknąć nadpisywania ewentualnych zmian.Dodaj następujące elementy do pliku .csproj / .vbproj
<Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target>
Następnie zmień akcję kompilacji dowolnych plików, które chcesz umieścić w folderze głównym, na RootContent.
źródło
RootContent
nie pojawia się on na liście rozwijanej „Akcja kompilacji”, a wpisanie go ręcznie powoduje wyświetlenie błędu „Wartość właściwości jest nieprawidłowa” w programie Visual Studio. Co mnie ominęło?Użyłem tego w VS2010, VS2015, VS2017 i VS2019. Preferuję to rozwiązanie, ponieważ:
Na początku pliku projektu:
<ItemGroup> <AvailableItemName Include="RootContent"> <!-- Add "RootContent" as a choice in the "Build Action" dropdown. --> <Visible>True</Visible> </AvailableItemName> </ItemGroup>
Zapożyczone z tej odpowiedzi
Po imporcie Microsoft .targets:
<PropertyGroup> <AssignTargetPathsDependsOn> $(AssignTargetPathsDependsOn); IncludeRootContentAsContent; </AssignTargetPathsDependsOn> </PropertyGroup> <Target Name="IncludeRootContentAsContent"> <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)"> <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> </CreateItem> </Target>
Zapożyczone z tej odpowiedzi
źródło
RootContent
co oznacza „zakodowane na stałe”, abyCustomContent
wskazać, że jest to specjalistyczna zawartość, którą dodajemy do tego projektu i musimy skopiować w ten szczególny sposób. Poza tym musiałemTargetPath=%(RecursiveDir)%(Filename)%(Extension)
odtworzyć strukturę folderów z określonychCustomContent
plików do ścieżki wyjściowej./common/browserhawk/
zostaną skopiowane,/bin/common/browserhawk/
jak powiedział OP? IIRC, moim zamiarem było, aby/common/browserhawk/a.txt
skończyć w,/bin/a.txt
ale zezwolić na rekursję stamtąd, więc/common/browserhawk/secret/stuff.png
kończy się w/bin/secret/stuff.png
.%(RecursiveDirectory)
. To jest naprawdę fajne, ponieważ oprócz wybierania pojedynczych plików w IDE możesz również określić wiele plików za pomocą symboli wieloznacznych. W przypadku użycia**
symbolu wieloznacznego cała struktura folderów zostanie zachowana.Skończyło się na dodaniu kroku do pliku kompilacji nant do skopiowania po pomyślnym zakończeniu
<target name="action.copy.browserhawk.config" depends="compile.source"> <copy todir="${App.Web.dir}/bin/" includeemptydirs="false"> <fileset basedir="${browserhawk.config.dir}"> <include name="bhawk_bb.dat" /> <include name="bhawk_sp.dat" /> <include name="browserhawk.properties" /> <include name="maindefs.bdd" /> <include name="maindefs.bdf" /> <include name="BH_PRO.lic" /> </fileset> </copy> <echo message="COPY BROWSERHAWK CONFIG: SUCCESS ${datetime::now()}" /> </target>
źródło
Możesz zbudować plik wsadowy, aby skopiować pliki i wykonać go jako zdarzenie po kompilacji.
źródło