mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
Integrate changes made directly to master
This commit is contained in:
@@ -34,7 +34,7 @@ Section [NuGet Package Metadata](../using/nuget-package-metadata.md) provides ad
|
||||
3. **Add lib & net45** - add the `lib` folder and the `net45` folder to the project. Squirrel is expecting a single `lib / net45` directory provided regardless of whether your app is a `net45` application.
|
||||
4. **Add Release Files** - add all the files from `bin\Release` needed by MyApp to execute (including the various files required by Squirrel).
|
||||
* **Include MyApp Files:** MyApp.exe, MyApp.exe.config, any non-standard .NET dll's needed by MyApp.exe.
|
||||
* **Include Squirrel Files:** Squirrel.dll, Splat.dll, NuGet.Squirrel.dll, Mono.Cecil.\*, DeltaCompressionDotNet.\*, ICSharpCode.SharpZipLib.\*
|
||||
* **Include Squirrel Files:** Squirrel.dll, Splat.dll, NuGet.Squirrel.dll, Mono.Cecil.\*, DeltaCompressionDotNet.\*,
|
||||
* **Exclude:** *.vshost.\*, *.pdb files
|
||||
5. **Save the NuGet Package File** - save the NuGet package file to where you can easily access later (e.g., `MyApp.sln` directory). Follow the given naming format (e.g., `MyApp.1.0.0.nupkg`).
|
||||
|
||||
|
||||
@@ -1,24 +1,36 @@
|
||||
| [docs](..) / [using](.) / machine-wide-installs.md
|
||||
|:---|
|
||||
|
||||
|
||||
| [docs](..) / [using](.) / machine-wide-installs.md
|
||||
|:---|
|
||||
|
||||
|
||||
# Machine-wide Installs
|
||||
|
||||
Squirrel's Releasify command generates an MSI file suitable for installation via Group Policy. This MSI isn't a general-purpose installer, this means that once you run the MSI, users from now on will get the app installed, on next Login.
|
||||
|
||||
So, most normal users should continue to run the Setup.exe's generated by Releasify, but if you want to have an IT Admin Friendly version, you can hand off the MSI
|
||||
|
||||
Most users of Squirrel won't have to do anything new to enable this behavior, though certain NuGet package IDs / names might cause problems with MSI.
|
||||
|
||||
**Source:** See [issue #466](https://github.com/Squirrel/Squirrel.Windows/issues/466) for more details.
|
||||
|
||||
### Disabling MSI Generation
|
||||
Generating MSIs can be disabled via the --no-msi flag as shown below:
|
||||
|
||||
~~~powershell
|
||||
PM> Squirrel --releasify MyApp.1.0.0.nupkg --no-msi
|
||||
~~~
|
||||
|
||||
---
|
||||
| Return: [Table of Contents](../readme.md) |
|
||||
|----|
|
||||
|
||||
Squirrel's Releasify command generates an MSI file suitable for installation via Group Policy. This MSI isn't a general-purpose installer, this means that once you run the MSI, users from now on will get the app installed, on next Login.
|
||||
|
||||
So, most normal users should continue to run the Setup.exe's generated by Releasify, but if you want to have an IT Admin Friendly version, you can hand off the MSI
|
||||
|
||||
## Common pitfalls
|
||||
|
||||
### Missing data in `.nuspec`
|
||||
|
||||
Most users of Squirrel won't have to do anything new to enable this behavior, though certain NuGet package IDs / names might cause problems with MSI.
|
||||
|
||||
**Source:** See [issue #466](https://github.com/Squirrel/Squirrel.Windows/issues/466) for more details.
|
||||
|
||||
### Nothing happens on login
|
||||
|
||||
In cases where the end user has previously installed your application, the installer that runs on login will not re-install your application on every login. This can easily be the case if you as a developer is testing out both the EXE and the MSI.
|
||||
|
||||
Squirrel leaves behind an almost-empty `%LocalAppData%\MyApp` folder after an uninstall. Deleting this folder (the entire folder, not just the contents) will allow the installer that runs on login to install successfully.
|
||||
|
||||
**Source:**: See [issue #555](https://github.com/Squirrel/Squirrel.Windows/issues/555#issuecomment-253265130) for details.
|
||||
|
||||
## Disabling MSI Generation
|
||||
Generating MSIs can be disabled via the --no-msi flag as shown below:
|
||||
|
||||
~~~powershell
|
||||
PM> Squirrel --releasify MyApp.1.0.0.nupkg --no-msi
|
||||
~~~
|
||||
|
||||
---
|
||||
| Return: [Table of Contents](../readme.md) |
|
||||
|----|
|
||||
|
||||
@@ -240,11 +240,14 @@ namespace Squirrel.Bsdiff
|
||||
long diffEndPosition = output.Position;
|
||||
WriteInt64(diffEndPosition - controlEndPosition, header, 16);
|
||||
|
||||
// write compressed extra data
|
||||
using (WrappingStream wrappingStream = new WrappingStream(output, Ownership.None))
|
||||
using (var bz2Stream = new BZip2Stream(wrappingStream, CompressionMode.Compress))
|
||||
// write compressed extra data, if any
|
||||
if (eblen > 0)
|
||||
{
|
||||
bz2Stream.Write(eb, 0, eblen);
|
||||
using (WrappingStream wrappingStream = new WrappingStream(output, Ownership.None))
|
||||
using (var bz2Stream = new BZip2Stream(wrappingStream, CompressionMode.Compress))
|
||||
{
|
||||
bz2Stream.Write(eb, 0, eblen);
|
||||
}
|
||||
}
|
||||
|
||||
// seek to the beginning, write the header, then seek back to end
|
||||
@@ -326,10 +329,13 @@ namespace Squirrel.Bsdiff
|
||||
compressedDiffStream.Seek(c_headerSize + controlLength, SeekOrigin.Current);
|
||||
compressedExtraStream.Seek(c_headerSize + controlLength + diffLength, SeekOrigin.Current);
|
||||
|
||||
// the stream might end here if there is no extra data
|
||||
var hasExtraData = compressedExtraStream.Position < compressedExtraStream.Length;
|
||||
|
||||
// decompress each part (to read it)
|
||||
using (var controlStream = new BZip2Stream(compressedControlStream, CompressionMode.Decompress))
|
||||
using (var diffStream = new BZip2Stream(compressedDiffStream, CompressionMode.Decompress))
|
||||
using (var extraStream = new BZip2Stream(compressedExtraStream, CompressionMode.Decompress))
|
||||
using (var extraStream = hasExtraData ? new BZip2Stream(compressedExtraStream, CompressionMode.Decompress) : null)
|
||||
{
|
||||
long[] control = new long[3];
|
||||
byte[] buffer = new byte[8];
|
||||
|
||||
@@ -601,7 +601,7 @@ namespace Squirrel.Update
|
||||
String.Format("sign {0} \"{1}\"", signingOpts, exePath), CancellationToken.None);
|
||||
|
||||
if (processResult.Item1 != 0) {
|
||||
var optsWithPasswordHidden = new Regex(@"/p\s+\w+").Replace(signingOpts, "/p ********");
|
||||
var optsWithPasswordHidden = new Regex(@"/p\s+\S+").Replace(signingOpts, "/p ********");
|
||||
var msg = String.Format("Failed to sign, command invoked was: '{0} sign {1} {2}'",
|
||||
exe, optsWithPasswordHidden, exePath);
|
||||
|
||||
|
||||
@@ -290,5 +290,28 @@ namespace Squirrel.Tests.Core
|
||||
tempFiles.ForEach(File.Delete);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HandleBsDiffWithoutExtraData()
|
||||
{
|
||||
var baseFileData = new byte[] { 1, 1, 1, 1 };
|
||||
var newFileData = new byte[] { 2, 1, 1, 1 };
|
||||
|
||||
byte[] patchData;
|
||||
|
||||
using (var patchOut = new MemoryStream())
|
||||
{
|
||||
Bsdiff.BinaryPatchUtility.Create(baseFileData, newFileData, patchOut);
|
||||
patchData = patchOut.ToArray();
|
||||
}
|
||||
|
||||
using (var toPatch = new MemoryStream(baseFileData))
|
||||
using (var patched = new MemoryStream())
|
||||
{
|
||||
Bsdiff.BinaryPatchUtility.Apply(toPatch, () => new MemoryStream(patchData), patched);
|
||||
|
||||
Assert.Equal(newFileData, patched.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user