I'm trying to publish a .Net web app using Powershell. I want to publish "all files in this project" but it only seems to be publishing "only files needed to run this application". When I publish from Visual Studio 2010 it work fine.
Here's my command:
& msbuild "$WebProjectFile" /verbosity:minimal "/t:ResolveReferences;_CopyWebApplication;publish" /p:Configuration=Release /p:OutDir="$PublishPath\bin\" /p:WebProjectOutputDir="$PublishPath"
Any ideas how I can do this?
Some notes since I am not sure exactly what is not working:
- CopyLocal set to true for all your references
- Add a specific copy files to the your build script
<Copy SourceFiles="#(ProjectBinFiles)" DestinationFolder="$(StageBin)\%ProjectBinFiles.RecursiveDir)" />
Below is a similar question about not all files copying:
MSBuild target _CopyWebApplication does not copy all necessary files to the bin folder
Not sure if any of this helps.
-Adam
[Edit: trying to undo my edit]
alistek pointed me in the right direction and I ended up using Robocopy to copy the missing files:
& robocopy "{folder with missing files}" "$PublishPath\{folder to put missing files}" /MIR /NJH /NJS /NFL /NDL
Notes:
This worked perfectly for me because all my missing files were from a single directory
The /NJH /NJS /NFL /NDL switches are only used to stop Robocopy from spitting its progress to the screen
Related
When doing a "dotnet publish" on windows for a freshly downloaded asp.net boilerplate template, everything works fine, and the resulting puplish folder can be used.
However when doing the same on linux, I get the following:
/bin/sh: 2: /tmp/tmpda90e7b4d99846c4936a6816fb7d9654.exec.cmd: robocopy: not found
Is there a specific way I am supposed to do a publish for asp.net boilerplate on linux?
AspNet Boilerplate merged solution has a PrepublishScript that executing a Robocopy step. Since Linux OS has no Robocopy command, you need to remove the below line in your MyProject.Web.Host.csproj
<Exec Command="robocopy $(MSBuildProjectDirectory)\wwwroot\dist\ $(MSBuildProjectDirectory)\wwwroot\ /S /E /MOVE" IgnoreExitCode="True" />
Click here to go to the related source code line.
And you need to make that step manually; copy the content of the $(MSBuildProjectDirectory)\wwwroot\dist\ to $(MSBuildProjectDirectory)\wwwroot\
PS: MSBuildProjectDirectory is the property that will give you the full path to the project file which was invoked on the command line
I have configured pre build events for a proj in visual studio.
All the files are copied in a particular folder as a part of this build command.
Recently i have added crx and xpi files in source folder.
These files alone are not getting copied to the destination folder.
Here is the build command:copy "$(SolutionDir)DLLRequired*.*" "$(TargetDir)"
here even though i have used "*.*", it skips the crx and xpi files.
Please help.
If these files are part of your project - you need to right click on them, select properties and in Copy to Output Directory select Copy always.
If these files are dynamic or are not part of your project - you should try doing this: XCOPY $(ProjectDir)\Libs\DLLRequired*.* $(TargetDir) /Y /R - this is using ProjectDir instead of SolutionDir and should always work.
Also if something does not work - check out Output windows for any error messages.
I am currently creating a console application which is reading from a folder which contains xml files, like so:
/Templates/Create.xml
/Template/Update.xml
But when I debug the application it is looking for the files in /bin/Debug/Templates because I use: System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
So it is doing exactly what i want it to ..but is there any way to get Visual Studio to copy the folder and files automatically to the Debug/Release folder?
At the moment I have to keep the two folders updated.
I have done this before in a Windows application, but I can't seem to figure it out in a console
SOLUTION:
I added the following code in Pre-build:
XCOPY "$(ProjectDir)Templates" "$(TargetDir)Templates" /R /Y /I /T
..and it works like a charm
In visual studio you can have post build actions. In this you can write command to copy the xml to the Debug/Release folder depending upon your BuildMode.
Update:
In Project Properties you can find this.
I've got a series of .NET 4 based web applications (WCF and Web) within the same solution, but need to selectively publish, from the command line.
I've tried various things so far, MSBuild, aspnet_compiler, but nothing, to date has worked.
I need to be able to specify the Project, not the solution, have any transforms run and have the output redirected to a folder...basically mimick the right mouse click 'Publish' option, using the File System.
In addition to all of this, I'd like to leave the projects alone - not adding msbuild files all over the place, as this is a specific build, and not necessarily related to the project.
Stuff I've tried:
Publish ASP.NET MVC 2 application from command line and Web.config transformations
Equivalent msbuild command for Publish from VS2008
Save the following script as publishProject.bat
rem publish passed project
rem params: %configuration% %destDir% %srcDir% %proj%
#echo off
SET DestPath=d:\projects\Publish\%2
SET SrcPath=d:\projects\Src\%3\
SET ProjectName=%4
SET Configuration=%1
RD /S /Q "%DestPath%" rem clear existed directory
:: build project
MSBuild "%SrcPath%%ProjectName%.vbproj" /p:Configuration=%Configuration%
:: deploy project
::/t:TransformWebConfig
MSBuild "%SrcPath%%ProjectName%.vbproj" /target:_CopyWebApplication /property:OutDir=%DestPath%\ /property:WebProjectOutputDir=%DestPath% /p:Configuration=%Configuration%
xcopy "%SrcPath%bin\*.*" "%DestPath%\bin\" /k /y
echo =========================================
echo %SrcPath%%3.vbproj is published
echo =========================================
I call it from another batch file
#echo off
rem VS2010. For VS2008 change %VS100COMNTOOLS% to %VS90COMNTOOLS%
call "%VS100COMNTOOLS%\vsvars32.bat"
SET ex=.\publishProject.bat Release
call %ex% KillerWebApp1 KillerWebApp1\KillerWebApp1 KillerWebApp1
call %ex% KillerWebApp2 KillerWebApp2\KillerWebApp2 KillerWebApp2
call %ex% KillerWebApp3 KillerWebApp3\KillerWebApp3 KillerWebApp3
call %ex% KillerWebApp4 KillerWebApp4\KillerWebApp4 KillerWebApp4
EDIT:
Code above works for most cases but not for all. I.e. we use another asp .net application and link it as virtual folder in IIS. For this situation VS2008 worked fine with code above but VS2010 also copy files from virtual directory while deploying. The following code works properly also in VS2010 (solution was found here)
Add to your project file (*.csproj, *.vbproj)
<Target Name="PublishToFileSystem" DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''" Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))" Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="#(PublishFiles)" DestinationFiles="#(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True" />
</Target>
Change publishProject.bat to:
rem publish passed project
rem params: %configuration% %destDir% %srcDir% %proj%
#echo off
SET DestPath=d:\projects\Publish\%2
SET SrcPath=d:\projects\Src\%3\
SET ProjectName=%4
SET Configuration=%1
:: clear existed directory
RD /S /Q "%DestPath%"
:: build and publish project
MSBuild "%SrcPath%%ProjectName%.vbproj" "/p:Configuration=%Configuration%;AutoParameterizationWebConfigConnectionStrings=False;PublishDestination=%DestPath%" /t:PublishToFileSystem
I know this is an old question, but I just learned something, so I decided I'd share: While it is 100% true that the "_CopyWebApplication" target exists and works, as of .NET 4.0 it has been superseded by the "_WPPCopyWebApplication" target in Microsoft.Web.Publishing.targets, which supports new features like web.config transformation syntax, etc.
Have you checked out WebDeploy?
This should do all the steps you need to have - it can bundle up a web app into a deployable file (a ZIP, basically), and there's an "engine" on the server that can interpret that deployable package and do all the heavy lifting for you.
Also see Scott Hanselman's Web Deployment Made Awesome: If You're Using XCopy, You're Doing It Wrong blog post - very enlightening!
My solution for CCNET with the Web.config transformation:
<tasks>
<msbuild>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable>
<workingDirectory>E:\VersionesCC\Trunk_4\SBatz\Gertakariak_Orokorrak\GertakariakMS\Web</workingDirectory>
<projectFile>GertakariakMSWeb2.vbproj</projectFile>
<targets>Build</targets>
<timeout>600</timeout>
<logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
<buildArgs>
/noconsolelogger /p:Configuration=Release /v:diag
/p:DeployOnBuild=true
/p:AutoParameterizationWebConfigConnectionStrings=false
/p:DeployTarget=Package
/p:_PackageTempDir=E:\Aplicaciones\GertakariakMS2\Web
</buildArgs>
</msbuild>
</tasks>
I would like to implement a post build event that performs the following actions
A relative path copy of the DLL output (1 file, not all the debug jazz)
A register the output DLL to GAC
How is this done?
Does that do you want?
copy $(TargetPath) $(TargetDir)..\..\someFolder\myoutput.dll
regasm $(TargetPath)
(Entered into the field for post-build step under project properties)
Enter following into "Project properties->Build events->Post build events command line:"
xcopy "$(TargetPath)" "target path" /Y && regasm "$(TargetPath)"
or add following snippet to project (e.g. csproj) file
<PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "target path" /Y && regasm "$(TargetPath)"</PostBuildEvent>
</PropertyGroup>
Note that it is recommended to add "" around copy command arguments to avoid problems with paths containing whitespaces. Also note that multiple commands can be combined using &&
Are you sure you want to do this as part of a compile? I would recommend using project references in solutions rather than the GAC if you can avoid it. Copying files is one thing, but registering in the GAC is fairly intrusive and you may want to consider the other environments your code is compiled in. Things like other developers' machines, and test environments/build servers etc. If you have a build server really you should be using something like NAnt with some sort of continuous integration server.
I had to same issue and I struggled a bit to make it works.
In my case, I wanted to do the other way around which is copying the SDL dll into my output folder.
copy "$(SolutionDir)SDL\lib\x86\SDL.dll" "$(SolutionDir)$(Configuration)\"
Note that, $(Configuration) will be your output folder (e.g. Debug or Release).
The quotes was what I was missing, apparently you need them when the right hand side end with a \. Thus, it might be safer to always use them.
Hope to save someone else a 5 minutes!
P.S. I use Visual Studio 2010
you may want to look at MS Build. Its what we use here at work.
CodeProject Link &
MSDN Ref
For step 2 in the question I seem to prefer the following:
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil" /f /i $(TargetPath)
Note: this requires the Windows SDK to be installed on your development machine.
More info on the available macros, such as $(TargetPath), on MSDN.
Ran into a related issue. The answers here helped (thanks!).
My scenario was in debugging an MEF-reliant application I needed to have the related DLLs in a particular location. I ran into issue with overwriting the prior build so did need to add a delete to the script.
delete $(SolutionDir)FileService\$(ProjectName).dll
copy $(TargetPath) $(SolutionDir)FileService\$(ProjectName).dll
Hope that helps someone, too!
This question is old. The easiest way is to add something like this on your .csproj file. For example I am running some tests on a virtual machine and its nice to have it sent to it after I compile:
<Project>
...
<!-- Upload to virtual machine -->
<Target Name="rsync" AfterTargets="Build">
<Exec Command="C:\Windows\System32\wsl.exe rsync -azv -e 'ssh -i /path/to/my/private/key' --delete /mnt/c/repos/MyProject/bin/Debug/net7.0/ root#vm.ublux.com:/usr/share/foo/" />
</Target>
</Project>